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(); } } } ```

Original source