У меня есть приложение Windows Forms, которое берет CSV-файл и просматривает в нем идентификаторы клиентов. для каждого идентификатора клиента выполняется обновление.
У меня два вопроса:
У меня есть кнопка паузы, которая должна остановить обработку идентификаторов клиентов в файле csv и сохранить последний идентификатор клиента процесса. Как я могу перестать просматривать идентификаторы клиентов в CSV и сохранить последний обработанный идентификатор клиента?
В следующий раз, когда я запущу приложение, оно должно начать обработку после последнего обработанного идентификатора клиента.
Подскажите, пожалуйста, как я могу это сделать?
//initially the customerID will be 0
int customerID = 0;
string inputFilePath = "C:\\customer_refno\\customerids.csv";
using (StreamReader input = File.OpenText(inputFilePath))
using (CsvReader csvread = new CsvReader(input))
{
IEnumerable<dynamic> records = csvread.GetRecords<dynamic>();
//StringBuilder buildtext = new StringBuilder();
foreach (var record in records)
{
//process customerID
lastProcessed = record.CustomerID;
}
}
private void btpause_click(object sender, EventArgs e)
{
//complete processing the currently processing customerID and stop
//store last processed customer ID
}
Да вы правы, извините, не вставил ссылки. Я использую библиотеку csvHelper
Вы можете сделать свой цикл асинхронным или использовать фонового работника и прервать его, когда захотите.
Создайте переменную isStop = false и проверьте в своем цикле, что isStop. В обработчике события клика измените isStop = true. Ваш цикл должен быть асинхронным или работать в фоновом режиме, чтобы он не зависел от дисплея, чтобы иметь возможность нажать кнопку и работать, как хотите, пока цикл работает.
Вы можете сделать это, сохранив позицию подчеркивания Stream. Но имейте в виду, что буфер может быть пропущен в одном и том же блоке файла.
Вот образец:
private static long _lastPos = 0;//Store this in a file and load on Apllication start
private static int _lastProcessed = -1;//Store this in a file and load on Apllication start
private static int _bufferSize = 4096;
private static bool _break = true; //Set or reset in btpause_click
static void Main(string[] args)
{
Loop();
Loop();
Loop();
}
private static void Loop()
{
int customerID = 0;
string inputFilePath = "D:\\temp\\customerids.csv";
using (StreamReader input = new StreamReader(inputFilePath, Encoding.UTF8, true, _bufferSize))
{
if (_lastPos > 0) input.BaseStream.Position = _lastPos;
using (CsvReader csvread = new CsvReader(input, new Configuration(){Delimiter = "\t"}))
{
IEnumerable<dynamic> records = csvread.GetRecords<dynamic>();
//StringBuilder buildtext = new StringBuilder();
foreach (var record in records)
{
//process customerID
var cosId = Int32.Parse(record.CustomerID);
if (_lastProcessed >= cosId) continue; //Skip to next if lower than processed
_lastProcessed = cosId;
_lastPos = input.BaseStream.Position - _bufferSize;
Console.WriteLine(" > " + record.CustomerID + "\t" + record.Name);
if (_break) {
//Do staff needed at the break, like save variables
break;
}
}
}
}
}
- Редактировать 1 - вы можете остановить цикл, установив для _break значение true (обычно это должно быть false в примере, это правда, чтобы показать, как получить только одного клиента) Если вам нужно получить обратную связь:
private void btpause_click(object sender, EventArgs e)
{
_break = true;
}
// ...
private static void Loop()
//... Modify loop, also see first sample in the case break is set:
Console.WriteLine(" > " + record.CustomerID + "\t" + record.Name);
if (_break) {
//Do staff needed at the break, like save variables
break;
}
//....
Спасибо, Даниэль, что подал мне идею для реализации. Но вы можете посоветовать, как я могу остановить чтение программы Streamreader при нажатии кнопки? Я не могу остановить его нажатием кнопки. Нет близкого метода
См. Мою правку, вы можете просто установить _break в значение true, при необходимости вы можете ввести некоторые действия в цикл, в котором проверяется _break.
CsvReader не является частью .Net Framework, откуда вы его используете?