Хотя ваш пример верен, использование другого потока бесполезно, потому что вы вызываете EndInvoke
в основном потоке, который блокируется до завершения операции и не может выполнять другую работу. Это было бы эквивалентно, если бы вы вызвали Invoke
для делегата или непосредственно сам метод FinalResult
. Обычно EndInvoke
вызывается в обратном вызове, предоставляемом методом BeginInvoke
:
class Program
{
public delegate int MyDelegate(List<int> someInts);
class MainClass
{
static void Main()
{
List<int> someInts = new List<int> { 1, 2, 3, 4, 5, 6, 7 };
MyDelegate test = FinalResult;
test.BeginInvoke(someInts, ar =>
{
MyDelegate del = (MyDelegate)ar.AsyncState;
Console.WriteLine(del.EndInvoke(ar));
}, test);
Console.ReadKey(true);
}
public static int FinalResult(List<int> Mylist)
{
return Mylist.Sum();
}
}
}
Что касается утечки памяти, вы можете взглянуть на этот поток .
P.S: члены экземпляра класса List не являются поточно-ориентированными, поэтому следует соблюдать осторожность при доступе к ним из нескольких потоков.