У меня есть приложение, которое импортирует данные, прочитанные из текстовых файлов из каталога в базу данных. У меня есть пользовательский интерфейс, который позволяет пользователю нажать кнопку импорта и начать импорт данных, и когда пользователь снова нажимает на эту кнопку, я хотел прекратить импорт данных в этих файлах. Я начал использовать потоки, чтобы разрешить это, чтобы не замораживать пользовательский интерфейс во время импорта данных. Но у меня есть несколько проблем. Я начал использовать thread.Abort () для уничтожения потока после того, как пользователь перестал хотеть импортировать, но когда пользователь снова щелкает по импорту, некоторые дубликаты данных добавляются в базу данных, потому что они начинают читать в верхней части текстового файла, который я не хочу , Мне сказали использовать ManualResetEvents и Thread.Join (), чтобы инициировать завершение импорта, но я запутался, как это должно работать. Прямо сейчас мой код выглядит так:
public ManualResetEvent event1 = new ManualResetEvent(false);
public Thread workerThread;
public Form1
{
InitializeComponent();
}
private void importButton_Click(object sender, EventArgs e)
{
if(importButton.Text == "Begin Import")
{
importButton.Text = "Stop Import";
//runs a service that begins reading and importing data and writing to
//a "console" box.
Service service = new Service(consoleBox);
//run the new thread to begin importing data
workerThread = new Thread(service.importData);
workerThread.Start();
}
else
{
importButton.Text = "Begin Import";
event1.Set();
while(!event1.WaitOne(TimeSpan.FromSeconds(4)))
{ //imports data for 30 more text files
service.importData(30);
workerThread.Join();
}
}
}
По сути, я пытаюсь сохранить зацикливание и проверку протектора, чтобы увидеть, есть ли какие-либо файлы, которые нужно прочитать, если есть, затем импортировать данные, иначе они спят в течение 4 секунд. Должен ли я использовать поточный таймер для этого? Я немного не уверен, что делать.