O método mais simples para compartilhar dados entre diferentes threads é shared data
o seguinte (alguns são pseudocódigos):
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;
}
}
Você pode ler sobre esse método nesta bela introdução sobre multithreading , no entanto, eu preferi ler sobre isso no O'Reilly book C# 3.0 in a nutshell
, dos irmãos Albahari (2007), que também pode ser acessado gratuitamente no Google Livros, assim como a versão mais recente do livro, porque também cobre o pool de threads, threads em primeiro plano versus segundo plano, etc etc, com um código de exemplo simples e agradável. (Isenção de responsabilidade: eu possuo uma cópia desgastada deste livro)
No caso de você estar fazendo um aplicativo WinForms, o uso de dados compartilhados é especialmente útil, porque os controles do WinForm não são seguros para threads. Usando um retorno de chamada para passar dados do thread de trabalho de volta para um controle WinForm, o thread de IU principal precisa de um código feio Invoke()
para tornar esse controle thread-safe. Usando dados compartilhados, e o thread único System.Windows.Forms.Timer
, com um curto Interval
de, digamos, 0,2 segundos, você pode facilmente enviar informações do thread de trabalho para o controle sem Invoke
.