我该怎么做才能在.NET 2.0中使用Task ?

.NET 4.0有TPL,它包含很好的Task类来封装异步编程模型。 我正在开发一个必须是.NET 2.0的应用程序,但我想避免重写Task。 有什么建议?

我知道你说你不想重写Task,但实际上你可以使用闭包创建一些相当简单的东西,它的行为有点像Task对象。 这是我用的:

public delegate R AsyncTask(); public static AsyncTask BeginTask(AsyncTask function) { R retv = default(R); bool completed = false; object sync = new object(); IAsyncResult asyncResult = function.BeginInvoke( iAsyncResult => { lock (sync) { completed = true; retv = function.EndInvoke(iAsyncResult); Monitor.Pulse(sync); } }, null); return delegate { lock (sync) { if (!completed) { Monitor.Wait(sync); } return retv; } }; } 

它是一个在传入的委托上调用BeginInvoke()的函数,并返回一个函数,该函数在被调用时会阻塞并等待传入​​的函数的结果。您必须为不同的方法签名创建此函数的重载,课程。

一种方法,你可以根据需要调整它,并添加其他行为,如Continuations等。关键是使用闭包和匿名委托。 应该在.NET 2.0中工作。

编辑 – 以下是如何使用它:

  public static string HelloWorld() { return "Hello World!"; } static void Main(string[] args) { var task = BeginTask(HelloWorld); // non-blocking call string result = task(); // block and wait } 

您将必须使用System.Threading.Thread类,您可以获取.net 3.5的Task类,但不能获取.net 2的Task类。

抱歉