在下面的代码中,由于接口的原因,该类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();
}
}
}
Task.FromResult<object>(null)
。