忽略异步任务方法的返回值

boo*_*ife 2 c# compiler-warnings async-await

这是场景:在我的WPF应用程序中,我希望始终保持循环运行以执行各种操作.我想到了这种模式:

    void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
    {
        SomeProcessAsync(); //throw away task
    }

    async Task SomeProcessAsync()
    {
        while (true)
        {
            DoSomething();

            await Task.Delay(1000);
        }
    }
Run Code Online (Sandbox Code Playgroud)

由于返回值未使用,该调用会触发警告.沉默警告的最简洁方法是什么?

#pragma warning disable 4014
            AddItemsAsync(); //throw away task
#pragma warning restore 4014
Run Code Online (Sandbox Code Playgroud)

这有效,但看起来很讨厌!

顺便说一句,我也可以使用计时器,但我喜欢这个循环的简单性.

svi*_*ick 11

正如克里斯回答中提到的那样,正确的解决方案是将事件处理程序转换为async void方法,然后使用await,以便正确传播异常。

但是,如果您确实想忽略Task,则可以将其分配给变量:

var ignored = SomeProcessAsync();
Run Code Online (Sandbox Code Playgroud)

或者在C#7.0中,您可以使用丢弃:

_ = SomeProcessAsync();
Run Code Online (Sandbox Code Playgroud)

  • 有趣的是,我在这里没有任何编译器警告。编译器团队必须考虑过这种情况。 (4认同)

chr*_*ris 6

您可以使事件处理程序异步:

async void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
{
    await SomeProcessAsync(); //throw away task
}
Run Code Online (Sandbox Code Playgroud)

通常情况下,这async void是不好的,但是当事件处理程序是异步的并且应该在这里处理异常而不是在任何调用时都是必要的.ConfigureAwait(false)如果SomeProcessAsync不需要UI上下文,您可以(并且应该)使用法线.