c# - 任务和 TAP 异步模式 : differences bwteewn factory. StartNew 和 TaskEx.Run

标签 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)任务方法 01Async() { 返回 TaskEx.Run(slowMethod);

菲斯

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

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

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

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

在 TAP 模式下使用异步任务的最佳实践是什么?

最佳答案

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

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

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

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

关于c# - 任务和 TAP 异步模式 : differences bwteewn factory. StartNew 和 TaskEx.Run,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10340643/

相关文章:

javascript - 事件停止重复

c# - BlockingCollection 与异步任务

c# - 我无法思考如何在 C# 中使用正则表达式或如何解决我的问题

c# - 多个提交按钮在 Controller 中获取空值?

c# - app.config/web.config 中的变量

Javascript循环遍历数组异步

C#:在声明变量时或在构造函数内初始化变量

objective-c - addChild 方法是同步完成还是异步完成?

c# - WPF 线程延迟

c# - .NET 中的异步排序(使用任务)