关于c#:如果我的接口必须返回Task,那么实现无操作的最佳方法是什么?

If my interface must return Task what is the best way to have a no-operation implementation?

在下面的代码中,由于接口的原因,类LazyBar必须从它的方法返回一个任务(为了参数,不能更改)。如果LazyBar的实现是不寻常的,因为它恰好快速同步地运行——从该方法返回无操作任务的最佳方法是什么?

我已经使用下面的Task.Delay(0),但是我想知道,如果函数被大量调用,这是否有任何性能副作用(为了参数起见,每秒数百次):

  • 这种句法上的甜言蜜语是否意味着一件大事?
  • 它是否开始阻塞应用程序的线程池?
  • 编译器解释器是否足以处理Delay(0)不同的问题?
  • return Task.Run(() => { });有什么不同吗?

有更好的方法吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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();
        }
    }
}