Async / Await方法 - 无需等待方法执行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Async / Await方法 - 无需等待方法执行相关的知识,希望对你有一定的参考价值。

我有一个发送通知目的的异步方法。但是我在调​​用方法时没有设置await关键字。因为没有必要等待对我的回应。

但是,它说,警告。 enter image description here

是否需要添加await关键字来解决警告或忽略它?

答案

如果您可以使用C#7功能,请将其指定为“discard”变量:

_ = iPushNotificationService.SendPushNotification(objNotificationMessage);

如果你不能使用C#7 - 你可以将它分配给一些变量:

var t = iPushNotificationService.SendPushNotification(objNotificationMessage);

或者像这样使用扩展方法:

public static class TaskExtensions {
    public static void Ignore(this Task t) {

    }
}

然后:

iPushNotificationService.SendPushNotification(objNotificationMessage).Ignore();

请注意,您可能对结果不感兴趣,但如果它无法发送该通知您可能会感兴趣,至少记录该通知。在这种情况下,您可以使用ContinueWith

SendNotification().ContinueWith(c =>
{
    // do something with c.Exception
}, TaskContinuationOptions.OnlyOnFaulted).Ignore();

或者将其移到单独的异步方法:

static async void SendNotification() { // if you hate async void - use Task
     try {
        await iPushNotificationService.SendPushNotification(objNotificationMessage);
     }
     catch (Exception ex {
         // log it
     }
}

然后打电话给它。

另一答案

您知道这是一次“即发即忘”操作,您无需等待它返回。但是编译器并不知道你知道。就其而言,您将返回一个任务(意味着您要监视任务进度)但不实际使用它。这不是错误,但它可能是一个错误,所以它会警告你。就这样。

如果你想避免警告,你可以做任何事情 - 几乎任何事情 - 与满足编译器担心任务被放弃的任务。我写了一个tiny extension method就是这么做的:

public static void Release(this Task task)
{
}

然后你可以使用iPushNotifications.SendPushNotifications(..).Release()和编译器将很高兴。

另一个不太明确但代码较少的替代方案是:

`iPushNotifications.SendPushNotifications(..).ContinueWith(_=>{ /* Do nothing */ });

注意:比沉默编译器警告更重要的是它会使您的代码明确地表明您正在做什么。查看代码的另一位开发人员不必猜测您是否打算等待执行完成。

以上是关于Async / Await方法 - 无需等待方法执行的主要内容,如果未能解决你的问题,请参考以下文章

async/await 的调用链......等待可等待的还是返回可等待的?

Task和async/await详解

Async_Await;

Visual Studio 分析异步方法,包括实际等待时间

async和await浅析

在 React Native 中,这两种方法中哪种 Async Await 方法更好,为啥?