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

本文关键字:工厂 StartNew Run bwteewn TaskEx TAP 异步 模式 任务 差异 | 更新日期: 2023-09-27 18:32:26

我正在使用新的TAP模式进行探测,使用任务和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 的按钮,让我测试异步方法。

我可以有以下方法01Aync的实现。

第一:

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;
            });
}

第四 私有任务方法01异步() { 返回 TaskEx.Run(slowMethod); }

第五

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

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

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

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

异步任务与 TAP 模式一起使用的最佳实践是什么?

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

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

试图"欺骗"编译器认为当你只使用循环和计数器时有工作要做,可能会导致不一致的行为。

这是在提到计时前没有预热的事实之前,这可能是在调试模式打开的情况下完成的,并且不显示计时代码本身。

总而言之 - 假设在现实世界中编写如何调用长时间运行的过程的方式的微小变化不会对您的性能产生实质性影响。

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