gpt4 book ai didi

.net - 是否应该始终在 AsyncCallback 中调用 EndInvoke 委托(delegate)?

转载 作者:行者123 更新时间:2023-12-04 03:55:24 25 4
gpt4 key购买 nike

我读了Use AsyncCallback ,有这个代码片段:

using System;
using System.Threading;
using System.Runtime.Remoting.Messaging;
class MainClass
{
delegate int MyDelegate(string s);

static void Main(string[] args)
{
MyDelegate X = new MyDelegate(DoSomething);
AsyncCallback cb = new AsyncCallback(DoSomething2);
IAsyncResult ar = X.BeginInvoke("Hello", cb, null);

Console.WriteLine("Press any key to continue");
Console.ReadLine();
}
static int DoSomething(string s)
{
Console.WriteLine("doooooooooooooooo");
return 0;
}

static void DoSomething2(IAsyncResult ar)
{
MyDelegate X = (MyDelegate)((AsyncResult)ar).AsyncDelegate;
X.EndInvoke(ar);
}
}
请注意,在 DoSomething2 ,这是一个 AsyncCallback ,委托(delegate)被命令 EndInvoke 明确杀死.
这真的有必要吗?因为 AsyncCallback除非并且直到委托(delegate)方法完成运行,否则不会被调用。

最佳答案

调用 EndInvoke() 非常重要。如果后台方法生成异常,则调用 EndInvoke() 将引发该异常,允许您的主线程处理它。此外,如果后台方法有返回值,则主线程需要调用 EndInvoke() 来检索该值。

如果您的后台线程属于上述任何一种情况(生成异常或具有返回值)并且您没有调用 EndInvoke(),那么后台线程将不会被释放——本质上会导致资源泄漏。

关于.net - 是否应该始终在 AsyncCallback 中调用 EndInvoke 委托(delegate)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1269983/

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