Memory Leak on BeginInvoke
c#, delegates
Solution
While your example is correct there is no benefit from using a different thread because you call `EndInvoke` on the main thread which will block until the operation completes and it cannot do other work. It would have been equivalent if you called `Invoke` on the delegate or directly the `FinalResult` method itself. Usually `EndInvoke` is called in the callback provided by the `BeginInvoke` method:
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();
}
}
}
As far as the memory leak is concerned you may take a look at this thread.
P.S: Instance members of the List<T> class are not thread safe so you should be careful when you access them from multiple threads.
Problem
1) I heard that when we won't call EndInvoke() it may lead to memory leak? can you demonstrate it how could this lead to memory leak? 2) When i suppose to call EndInvoke() shall i use the code like following ? ``` namespace BlockMechanism { 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; IAsyncResult res=test.BeginInvoke(someInts, null, test); Console.WriteLine(test.EndInvoke(res)); Console.ReadKey(true); } public static int FinalResult(List<int> Mylist) { return Mylist.Sum(); } } } ```