c# - BeginInvoke 内存泄漏

标签 c# delegates

1) 我听说当我们不调用 EndInvoke() 时可能会导致内存泄漏?你能演示一下这怎么会导致内存泄漏吗?

2) 当我想调用 EndInvoke() 时,我应该使用如下代码吗?

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

    }
}

最佳答案

虽然您的示例是正确的,但使用不同的线程没有任何好处,因为您在主线程上调用了 EndInvoke,这将阻塞直到操作完成并且它无法执行其他工作。如果您在委托(delegate)上调用 Invoke 或直接调用 FinalResult 方法本身,这将是等效的。通常在 BeginInvoke 方法提供的回调中调用 EndInvoke:

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

就内存泄漏而言,您可以看看这个 thread .

P.S:List<T> 的实例成员类不是线程安全的,因此当您从多个线程访问它们时应该小心。

关于c# - BeginInvoke 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1814931/

相关文章:

c# - 24位整数

c# - 在 X 时间内在 C# 中加载动画 GIF 图片

c# - B-Trees/B+Trees 和重复键

javascript - Datagrid 相当于 HTML 表单占位符属性

c# - 将方法存储为类的成员变量

c# - 重构方法调用具有不同参数签名的委托(delegate)

objective-c - Objective-C 中的异常/错误处理(iPhone 应用程序)

c# - (Func, Action, Predicate) VS 转换器和比较委托(delegate) c#

c# - 读取原始 XML 格式的 MSMQ 消息

c# - 为什么匿名委托(delegate)/lambda 不推断 out/ref 参数的类型?