任务<t> vs c#中的异步委托?</t>

时间:2012-12-04 07:37:40

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

我应该何时使用?

2 个答案:

答案 0 :(得分:18)

第二种形式,使用IAsyncResult,显着更老,功能更强大。 {4}在.NET 4中引入,是现在表示异步操作的首选方式。它使用起来要简单得多,特别是在C#5中,它支持&#34;异步功能&#34;您可以在其中以非阻塞方式等待任务(或其他异步操作)。

使用Task<T>代替调用Task可能无法改变操作本身的执行方式(尽管它在调度等方面为您提供了更多选项),但它使得与想要观看&#34;观看&#34;的代码的角度有很大的不同。操作,使用结果,等待多个任务,处理故障等。

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

答案 1 :(得分:0)

任务更优雅,最近才推出(.Net 4),所以如果它符合你的需求,我会选择它。