13

我有这个简单的方法:

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);
  • 他们都使用线程池线程。
  • 两者都等待执行完成(读取值时)
  • 两者都向调用者重新抛出任何异常。

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

4

2 回答 2

20

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

使用 aTask而不是调用BeginInvoke可能不会改变操作本身的执行方式(尽管它在调度等方面为您提供了更多选择),但从想要“观看”的代码的角度来看,它会产生巨大的差异操作、使用结果、等待多个任务、处理故障等。

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

于 2012-12-04T07:41:20.137 回答
0

任务更优雅,并且是最近引入的(.Net 4),所以如果它满足您的需求,我会同意的。

于 2012-12-04T07:43:14.203 回答