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

标签 c# .net asynchronous task task-parallel-library

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

最佳答案

我知道你说过你不想重写 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;
            }
        };
    }

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

一种方法是,您可以根据需要调整它,并添加其他行为,如 Continuations 等。关键是使用闭包和匿名委托(delegate)。应该在 .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

    }

关于c# - 我应该怎么做才能在 .NET 2.0 中使用 Task<T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6550933/

相关文章:

c# - WCF 客户端不考虑主机地址

python - 为什么 trollius 不让这个循环异步运行?

javascript - 在 node.js 中,如何使用 child_process.exec 以便所有操作都可以异步发生?

c# - 在使用委托(delegate)的多线程 winform 应用程序中,什么被认为是好的编程实践?

c# - 单声道高分辨率计时器(在 Linux 上)

c# - 尝试将 float 转换为 Int32 时 Convert.ToInt32(float) 失败

c# - 以特定格式对数据进行排序

.net - ASP.NET MVC 期望 DateTime 采用什么格式,以便模型绑定(bind)能够正常工作?

.net - F# 函数返回值

c# - 异步编程像僵尸病毒吗?