С http://www.albahari.com/threading/#_Entering_the_Thread_Pool_via_TPL
static void Main()
{
Func<string, int> method = Work;
method.BeginInvoke ("test", Done, method);
// ...
//
}
static int Work (string s) { return s.Length; }
static void Done (IAsyncResult cookie)
{
var target = (Func<string, int>) cookie.AsyncState;
int result = target.EndInvoke (cookie);
Console.WriteLine ("String length is: " + result);
}
По сути, «Работа» - это метод, который вы хотите запустить в другом потоке. «Готово» - это метод, который вы хотите вызвать, когда «Работа» завершена - вы должны указать здесь свой код сообщения о состоянии. method.BeginInvoke принимает те же параметры, что и Work, плюс два других параметра: обратный вызов и информация о состоянии, которая может быть любой, какой вы захотите. Функция обратного вызова должна принимать один параметр: IAsyncResult. Вы можете получить доступ к информации о состоянии, которую вы передаете, получив AsyncState от IAsyncResult. В приведенном выше примере «цель» означает то же самое, что и «метод». Это полезно - это означает, что вы можете вызвать «EndInvoke» для метода / цели, что даст вам возвращаемое значение, которое вам нужно. «result» - это возвращаемое значение «Work».
Если вам нужно несколько потоков, просто имейте несколько делегатов (как «метод» в приведенном выше примере), и BeginInvoke запускайте их все, один за другим. Вы можете сделать так, чтобы все они имели одинаковый обратный вызов, или они могут иметь разные обратные вызовы Вам решать.
Надеюсь, это поможет!