gpt4 book ai didi

c# - BeginInvoke 内存泄漏

转载 作者:行者123 更新时间:2023-11-30 14:43:34 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com