使用C#6进行一行方法调用以获得等待方法?

Nat*_*ook 3 c# mono async-await c#-6.0

在Jon Skeet的C#6帖子中,用C#6命名了Clean Event Handlers Invocation,他展示了你现在如何写作

public void OnFoo()
{
    Foo?.Invoke(this, EventArgs.Empty);
}
Run Code Online (Sandbox Code Playgroud)

代替

public void OnFoo()
{
    EventHandler handler = Foo;
    if (handler != null)
    {
        handler(this, EventArgs.Empty);
    }   
}
Run Code Online (Sandbox Code Playgroud)

如果我们谈论一个等待的方法,有没有办法做这样的单线程?如果我试试

await Foo?.Invoke();
Run Code Online (Sandbox Code Playgroud)

我得到以下编译错误:

所述awaiter类型System.Runtime.CompilerServices.TaskAwaiter?必须有合适的IsCompletedGetResult构件(CS4011).

注意:我使用的是Mono(Xamarin Studio for OSX v5.9.5),因此编译器结果可能与使用Visual Studio的结果不同.

Har*_*ues 5

@ i3arnon有一个很好的解决方案,但这是你可以做到的另一种不需要添加字段或属性的方法.

await (Foo?.Invoke() ?? Task.CompletedTask);
Run Code Online (Sandbox Code Playgroud)

或者如果 Task<T>

var i = await (Foo?.Invoke() ?? Task.FromResult<T>(default(T)))
Run Code Online (Sandbox Code Playgroud)