Это прекрасный пример того, почему существует ThreadPool. Обратите внимание, что когда вы передаете делегата методу, который вы хотите подключить к ThreadPool, основной поток пользовательского интерфейса (тот, который управляет насосом сообщений) свободен и чист, ожидая следующего события пользовательского интерфейса. Если вы часто не общаетесь с потоком пользовательского интерфейса, не должно быть никаких причин, по которым поток пользовательского интерфейса может зависнуть до такой степени, что он перестает отвечать.
private void btnStart_Click(object sender, EventArgs e)
{
// spawn the GetServerData() method on the ThreadPool
ThreadPool.QueueUserWorkItem(new WaitCallback(GetServerData));
// after the above is called, you'll immediately get here because
// the UI thread is free from having to process GetServerData()
return;
}
Примечание. Для делегата WaitCallback требуется один параметр объекта. Также обратите внимание на комментарий к заявлению «lock» ниже.
private void GetServerData(object o)
{
try
{
while (true)
{
// if ANYTHING in the UI thread requires this lock (recurring timer),
// you've just eliminated ANY benefit to having this on a separate thread
lock (myLock)
{
// processor intensive code
}
}
}
catch
{
// handle exceptions
}
}