任务和TAP异步模式:差异bwteewn factory.StartNew和TaskEx.Run

时间:2012-04-26 20:04:27

标签: c# asynchronous task

我正在使用新的TAP模式进行探测,使用Task和CTP实现异步方法。

我有以下代码:

private async void btnAsync01_Click(object sender, RoutedEventArgs e)
        {
            UpdateTxtLog("Enter in button Async01: " + System.DateTime.Now);
            double result = await method01Async();
            UpdateTxtLog("exit in button Async01: " + System.DateTime.Now);
            UpdateTxtLog("result: " + result.ToString());
        }

GUI的按钮让我测试异步方法。

我可以使用method01Aync的以下实现。

首先:

private async Task<double> method01Async()
        {
              return await Task.Factory.StartNew<double>(slowMethod);
        }


private double slowMethod()
{
            double doubleDummy = 0;
            for (double i = 0; i < 1000000000; i++)
            {
                doubleDummy++;
            }
            return doubleDummy;
}

第二

private Task<double> method01Aync()
{
return Task.Factory.StartNew<double>(() =>
            {
                //O métodos auxiliares lentos... etc.
                double doubleDummy = 0;
                for (double i = 0; i < 1000000000; i++)
                {
                    doubleDummy++;
                }
                return doubleDummy;
            });
}

第三

private Task<double> method01Aync()
{
            return TaskEx.Run<double>(() =>
            {
                double doubleDummy = 0;
                for (double i = 0; i < 1000000000; i++)
                {
                    doubleDummy++;
                }
                return doubleDummy;
            });
}

第四     private Task method01Async()     {     return TaskEx.Run(slowMethod);     }

FITH

private Task<double> method01Async
{
return TaskEx.Run<double>(() =>
            {
                return metodoLento();
            });
}

我的结果是实现1和4带我22s aprox。同时完成另外两个需要5个。为什么存在这种差异?在实现1和4中,仅使用与循环相同的代码的辅助方法。

我注意到如果我使用slowMethod()作为Task的构造函数的参数非常慢,并且如果我在TaskEx或任务中使用委托,则工厂很快。为什么会这样?有什么区别?

使用Task.Factory或TaskEx.Run的区别是什么?

使用与TAP模式的任务异步的最佳做法是什么?

2 个答案:

答案 0 :(得分:2)

运行方法的顺序也很重要。尝试运行它们2次,只计算第二次运行时间。 无论如何,如果你想了解两者之间的差异,这里是最好的文章:http://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx

答案 1 :(得分:2)

性能测试是一个棘手的主题。

试图“欺骗”编译器认为当你只是使用循环和计数器时可以完成的工作可能会导致不一致的行为。

这是在提到时间之前没有预热的事实之前,这可能是在启用调试模式时完成的,并且时序代码本身没有显示。

总而言之 - 假设您在现实世界中编写如何调用长时间运行流程的方式发生微小变化 将严重影响您的表现。