Самый простой способ обмена данными между разными потоками выглядит shared data
следующим образом (некоторые из них являются псевдокодом):
class MyThread
{
public string SharedData;
public void Worker()
{
...lengthy action, infinite loop, etc...
SharedData = "whatever";
...lengthy action...
return;
}
}
class Program
{
static void Main()
{
MyThread m = new MyThread();
Thread WorkerThread = new Thread(m.Worker);
WorkerThread.Start();
loop//or e.g. a Timer thread
{
f(m.SharedData);
}
return;
}
}
Вы можете прочитать об этом методе в этом красивом введении о многопоточности , однако я предпочел прочитать об этом в O'Reilly book C# 3.0 in a nutshell
книге братьев Альбахари (2007), которая также находится в свободном доступе в Google Книгах, как и более новая версия книги. потому что он также охватывает пул потоков, потоки переднего плана по сравнению с фоновыми потоками и т. д. с красивым и простым примером кода. (Отказ от ответственности: у меня есть изношенная копия этой книги)
Если вы создаете приложение WinForms, использование общих данных особенно удобно, поскольку элементы управления WinForm не являются потокобезопасными. Используя обратный вызов для передачи данных из рабочего потока обратно в элемент управления WinForm, основной поток пользовательского интерфейса нуждается в уродливом коде, Invoke()
чтобы сделать этот элемент управления потокобезопасным. Используя вместо этого общие данные и однопоточные System.Windows.Forms.Timer
, с коротким, Interval
скажем, 0,2 секунды, вы можете легко отправлять информацию из рабочего потока в элемент управления без Invoke
.