Вы можете использовать продолжение.Я не помню точный синтаксис, но это что-то вроде:
textBox1.Text = "Enter Thread"; //assuming here we're on the UI thread
Task t = Task.Factory.StartNew(delegate
{
for (int i = 0; i < 20; i++)
{
//My Long Running Work
}
return result;
})
.ContinueWith(ret => textBox1.Text = textBox1.Text + Environment.NewLine + result,
TaskScheduler.FromCurrentSynchronizationContext());
Альтернативой может быть что-то вроде:
Task t = Task.Factory.StartNew(delegate
{
YourForm.Invoke((Action)(() => textBox1.Text = "Enter Thread");
for (int i = 0; i < 20; i++)
{
//My Long Running Work
}
YourForm.Invoke((Action)(() => textBox1.Text = textBox1.Text + Environment.NewLine + result);},
CancellationToken.None, TaskCreationOptions.None);
Опять же, я не помню точный синтаксис, ноИдея состоит в том, что вы хотите выполнить длинную операцию в потоке , отличном от потока пользовательского интерфейса , но сообщить о ходе выполнения (включая завершение) в потоке пользовательского интерфейса.
Кстати, BackGroundWorker класс будет работать здесь очень хорошо (лично мне это очень нравится).