gpt4 book ai didi

c# - Task 与 C# 中的异步委托(delegate)?

转载 作者:可可西里 更新时间:2023-11-01 08:39:43 26 4
gpt4 key购买 nike

我有这个简单的方法:

static int Work (string s) { return s.Length; }

我可以运行它:

Task<string> task = Task.Factory.StartNew<int> (() => Work ("lalala") );
...
int result = task.Result;

或者用这个:

Func<string, int> method = Work;
IAsyncResult myIasync= method.BeginInvoke ("lalala", null, null);
...
int result = method.EndInvoke (myIasync);
  • 他们都使用线程池线程。
  • 都等待执行完成(读取值时)
  • 两者都向调用者重新抛出任何异常。

我什么时候应该使用每个?

最佳答案

第二种形式,使用IAsyncResult ,明显更老,而且功能更弱。 Task<T>在 .NET 4 中引入,现在是表示异步操作的首选方式。它使用起来更简单,特别是在支持“异步函数”的 C# 5 中,您可以在其中以非阻塞方式等待任务(或其他异步操作)。

使用 Task而不是调用 BeginInvoke操作本身的执行方式可能不会有太大变化(尽管它在调度等方面为您提供了更多选择),但从想要“观察”操作的代码的角度来看,它有很大的不同,使用结果,等待多个任务,处理失败等。

如果您可以使用 C# 5(与 .NET 4.5 一起使用,或者与 .NET 4 加上异步目标包一起使用),那么在管理异步操作方面将使您的生活变得更加轻松。这是前进的方向:)

关于c# - Task<T> 与 C# 中的异步委托(delegate)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13698129/

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