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

Bri*_*ler 16 .net c# asynchronous task task-parallel-library

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

Sea*_*man 13

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

    public delegate R AsyncTask<R>();

    public static AsyncTask<R> BeginTask<R>(AsyncTask<R> 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;
            }
        };
    }
Run Code Online (Sandbox Code Playgroud)

它是一个函数,它在你传入的委托上调用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

    }
Run Code Online (Sandbox Code Playgroud)


Jet*_*hro 6

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

抱歉

  • [Rx](http://go.microsoft.com/fwlink/?linkid=179929&amp;clcid=0x804)团队将“任务”和其他低层抽象(但不是整个TPL)反向移植到.NET 3.5 SP1。 (2认同)