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

标签 c# .net multithreading .net-4.0

我有这个简单的方法:

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/

相关文章:

c# - 寻找最长的重叠周期

.net - 我如何告诉 -all- .NET Trace Sources 使用监听器?

.net - 工具比较: Visual Assist X and Resharper

c# - 初始化中的ThreadState异常

c# - 如何在 C# 中创建转发方法调用的代理对象?

许多 RaisePropertyChanged 上的 C# MVVM 无响应 UI

c# - 不包含分隔符时的字符串拆分实用程序方法问题

.net - 是否有一个库可以完成.Net的找平器功能?

ios - 线程运行后快速更改线程 qualityOfService/priority

multithreading - 像特斯拉的 AutoPilot 这样的系统如何跟上不断变化的多进程请求?