簡體   English   中英

Async / Await方法 - 無需等待方法執行

[英]Async / Await method - No need to wait for method execution

我有一個發送通知目的的異步方法。 但是我在調​​用方法時沒有設置await關鍵字。 因為沒有必要等待對我的回應。

但是,它說,警告。 在此輸入圖像描述

是否需要添加await關鍵字來解決警告或忽略它?

知道這是一次“即發即忘”操作,您無需等待它返回。 但是編譯器並不知道你知道。 就其而言,您將返回一個任務(意味着您要監視任務進度)但不實際使用它。 這不是錯誤 ,但它可能是一個錯誤,所以它會警告你。 就這樣。

如果你想避免警告,你可以做任何事情 - 幾乎任何事情 - 與滿足編譯器擔心任務被放棄的任務。 我寫了一個很小的擴展方法就是這樣做的:

public static void Release(this Task task)
{
}

然后你可以使用iPushNotifications.SendPushNotifications(..).Release()和編譯器會很高興。

另一個不太明確但代碼較少的替代方案是:

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

注意:比沉默編譯器警告更重要的是它會使您的代碼明確地表明您正在做什么。 查看代碼的另一位開發人員不必猜測您是否打算等待執行完成。

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

然后打電話給它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM