C# 任务和TAP异步模式:bwteewn factory.StartNew和TaskEx.Run的差异
我使用新的TAP模式进行探测,使用Task和CTP实现异步方法 我有以下代码:C# 任务和TAP异步模式:bwteewn factory.StartNew和TaskEx.Run的差异,c#,asynchronous,task,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();
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 async Task method01Async()
{
返回等待任务.Factory.StartNew(slowMethod);
}
私有双慢方法()
{
双重虚拟=0;
对于(双i=0;i<100000000;i++)
{
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 method01Aync()
{
返回Task.Factory.StartNew(()=>
{
//métodos助手lentos…等。
双重虚拟=0;
对于(双i=0;i<100000000;i++)
{
doubleDummy++;
}
返回双假人;
});
}
第三
private Task method01Aync()
{
返回TaskEx.Run(()=>
{
双重虚拟=0;
对于(双i=0;i<100000000;i++)
{
doubleDummy++;
}
返回双假人;
});
}
第四
私有任务method01Async()
{
返回TaskEx.Run(slowMethod);
}
菲斯
private Task method01Async
{
返回TaskEx.Run(()=>
{
返回metodoLento();
});
}
我的结果是,实现1和4需要22秒的时间。同时,其他两个需要5秒才能完成。为什么会存在这种差异?在实现1和4中,仅使用与循环具有相同代码的辅助方法
我注意到,如果我使用slowMethod()作为任务构造函数的参数,速度会非常慢,如果我在TaskEx或任务工厂中使用委托,速度会非常快。为什么会这样?有什么不同
使用Task.Factory或TaskEx.Run的区别是什么
在TAP模式下使用async with task的最佳实践是什么?运行方法的顺序也很重要。试着跑两次,只跑第二次。
无论如何,如果您想了解这两者之间的差异,这里有一篇最好的文章:运行方法的顺序也很重要。试着跑两次,只跑第二次。
无论如何,如果你想了解两者之间的区别,这里有一篇最好的文章:性能测试是一个棘手的话题 当您仅使用循环和计数器时,试图“欺骗”编译器,使其认为有工作要做,这可能会导致不一致的行为 这是在提到计时之前没有预热的事实之前,这可能是在调试模式打开的情况下完成的,并且计时代码本身没有显示
总而言之-假设您编写如何在现实世界中调用长时间运行的流程的方式的微小变化不会对您的性能产生实质性影响。性能测试是一个棘手的问题 当您仅使用循环和计数器时,试图“欺骗”编译器,使其认为有工作要做,这可能会导致不一致的行为 这是在提到计时之前没有预热的事实之前,这可能是在调试模式打开的情况下完成的,并且计时代码本身没有显示 总而言之-假设您编写如何在现实世界中调用长时间运行的流程的方式的微小变化不会对您的性能产生实质性影响
private Task<double> method01Aync()
{
return TaskEx.Run<double>(() =>
{
double doubleDummy = 0;
for (double i = 0; i < 1000000000; i++)
{
doubleDummy++;
}
return doubleDummy;
});
}
private Task<double> method01Async
{
return TaskEx.Run<double>(() =>
{
return metodoLento();
});
}