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

时间:2018-03-01 09:56:43

标签: c# asynchronous async-await

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

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

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

2 个答案:

答案 0 :(得分:2)

知道这是"火灾和忘记"操作并且您不需要等待它返回。但是编译器并不知道你知道。就其而言,您将返回一个任务(意味着您要监视任务进度)但不实际使用它。这不是错误,但这可能是一个错误,所以它会警告你。这就是全部。

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

public static void Release(this Task task)
{
}

然后您可以使用iPushNotifications.SendPushNotifications(..).Release(),编译器会很高兴。

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

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

注意:比沉默编译器警告更重要的是,它会使您的代码显式关于您正在做的事情。另一位查看代码的开发人员不必猜测您是否意味着等待执行完成与否。

答案 1 :(得分:1)

如果您可以使用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
     }
}

然后打电话给它。