如何使用AsyncLazy调用非静态方法

时间:2019-04-01 15:48:03

标签: c# asynchronous

我必须使用非静态DoStuffOnlyOnceAsync方法,该方法试图使用AsyncLazy进行调用,但出现错误。

如何调用非静态方法?

  

字段初始化器无法引用非静态字段,方法或属性'TestClass.DoStuffOnlyOnceAsync()'

 using System;
 using System.Runtime.CompilerServices;
 using System.Threading.Tasks;

 namespace Registry
{
public class AsyncLazy<T> : Lazy<Task<T>>
{
    public AsyncLazy(Func<T> valueFactory) : base(() => Task.Run(valueFactory)) { }

    public AsyncLazy(Func<Task<T>> taskFactory) : base(() => Task.Run(() => taskFactory())) { }

    public TaskAwaiter<T> GetAwaiter() { return Value.GetAwaiter(); }
}
public class TestClass
{
    private AsyncLazy<bool> asyncLazy = new AsyncLazy<bool>(async () =>
    {
        await DoStuffOnlyOnceAsync();
        return true;
    });

    public TestClass() { }

    public async Task DoStuffOnlyOnceAsync()
    {
        await Task.FromResult(false);
    }
}
}

1 个答案:

答案 0 :(得分:1)

限制是字段初始化器不能调用任何非静态方法。对于任何字段初始值设定项都是如此,与AsyncLazy<T>async无关。

要解决此问题,请在构造函数中初始化字段:

public TestClass()
{
  asyncLazy = new AsyncLazy<bool>(async () =>
  {
    await DoStuffOnlyOnceAsync();
    return true;
  });
}