Самый простой способ для обмена данными между различными потоками - это 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
.