Jon*_*Rea 390 .net c# threadpool task-parallel-library async-await
在下面的代码中,由于接口,类LazyBar
必须从它的方法返回一个任务(并且为了参数而不能更改).如果LazyBar
s的实现是不寻常的,那么它恰好快速且同步地运行 - 从方法返回No-Operation任务的最佳方法是什么?
我已经在Task.Delay(0)
下面了,但是我想知道如果这个函数被调用了很多(如果参数起见,比如说每秒数百次),这是否有任何性能副作用:
Delay(0)
不同方式处理?return Task.Run(() => { });
有什么不同?有没有更好的办法?
using System.Threading.Tasks;
namespace MyAsyncTest
{
internal interface IFooFace
{
Task WillBeLongRunningAsyncInTheMajorityOfImplementations();
}
/// <summary>
/// An implementation, that unlike most cases, will not have a long-running
/// operation in 'WillBeLongRunningAsyncInTheMajorityOfImplementations'
/// </summary>
internal class LazyBar : IFooFace
{
#region IFooFace Members
public Task WillBeLongRunningAsyncInTheMajorityOfImplementations()
{
// First, do something really quick
var x = 1;
// Can't return 'null' here! Does 'Task.Delay(0)' have any performance considerations?
// Is it a real no-op, or if I call this a lot, will it adversely affect the
// underlying thread-pool? Better way?
return Task.Delay(0);
// Any different?
// return Task.Run(() => { });
// If my task returned something, I would do:
// return Task.FromResult<int>(12345);
}
#endregion
}
internal class Program
{
private static void Main(string[] args)
{
Test();
}
private static async void Test()
{
IFooFace foo = FactoryCreate();
await foo.WillBeLongRunningAsyncInTheMajorityOfImplementations();
return;
}
private static IFooFace FactoryCreate()
{
return new LazyBar();
}
}
}
Run Code Online (Sandbox Code Playgroud)
Ree*_*sey 559
使用Task.FromResult(0)
或Task.FromResult<object>(null)
将产生比Task
使用no-op表达式创建更少的开销.在Task
使用预先确定的结果创建a 时,不会涉及调度开销.
今天,我建议使用Task.CompletedTask来实现这一目标.
i3a*_*non 178
要添加Reed Copsey关于使用的答案Task.FromResult
,如果缓存已完成的任务,则可以进一步提高性能,因为已完成任务的所有实例都相同:
public static class TaskExtensions
{
public static readonly Task CompletedTask = Task.FromResult(false);
}
Run Code Online (Sandbox Code Playgroud)
有了TaskExtensions.CompletedTask
您可以使用相同的实例在整个应用程序域.
在.Net框架(V4.6)的最新版本增加了这一点与Task.CompletedTask
静态属性
Task completedTask = Task.CompletedTask;
Run Code Online (Sandbox Code Playgroud)
Jon*_*nna 36
Task.Delay(0)
因为它是一个很好的方法,因为它是一个完整的缓存副本Task
.
从4.6开始,现在Task.CompletedTask
它的目的更明确,但不仅Task.Delay(0)
仍然返回单个缓存实例,它返回相同的单个缓存实例Task.CompletedTask
.
两者的缓存性质都不能保证保持不变,但是作为依赖于实现的优化,它们只是依赖于实现的优化(也就是说,如果实现改变为仍然有效的东西,它们仍能正常工作)的使用Task.Delay(0)
是比接受的答案更好.
Ale*_*zzi 16
最近遇到这个并且不断收到关于该方法无效的警告/错误.
我们正在安抚编译器并清除它:
public async Task MyVoidAsyncMethod()
{
await Task.CompletedTask;
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,这里汇集了所有建议中的最佳建议.除非您实际在该方法中执行某些操作,否则不需要返回语句.
return Task.CompletedTask; // this will make the compiler happy
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
142836 次 |
最近记录: |