簡體   English   中英

使用 async 而不等待 function 包含另一個返回 void 的 function

[英]Use async without await with a function that holds another function that returns void

所以我有這個 WrapperFunction 試圖使 FunctionReturningVoid 被異步調用:

    public async Task WrapperFunction()
    {
        this.FunctionReturningVoid("aParameter");
    }

這是 function 什么都不返回。 在代碼的某些部分(此處未詳細說明),它被稱為 SYNChronously,但在 CallerFunction() 中,我們希望它以 ASYNChronously 運行。

    public void FunctionReturningVoid(string myString)
    {
        Console.Write(myString);
    }

這是 function 實現了異步並且需要讓 WrapperFunction 在不阻塞 otherStuff() 的情況下完成其工作。

    public async Task CallerFunction()
    {
        await WrapperFunction():
        int regular = otherStuff();
        ...
    }

IDE 警告我 WrapperFunction 沒有使用等待:

此異步方法缺少“等待”運算符,將同步運行。 考慮使用“await”運算符來等待非阻塞 API 調用,或“await Task.Run(...)”在后台線程上執行 CPU 密集型工作。

問題:如何在 WrapperFunction 中使用 async 而不使用 await? 如果我使用等待它告訴我不能等待無效。

區分異步和並行很重要。

異步意味着在等待某事發生時不阻塞當前線程。 這讓當前線程 go 在等待時執行其他操作。

並行意味着同時做不止一件事。 這需要為每個任務使用單獨的線程。

您不能異步調用FunctionReturningVoid ,因為它不是異步方法。 在您的示例中, Console.WriteLine()的編寫方式將阻塞線程直到它完成。 你無法改變這一點。 但我知道這只是你這個問題的例子。 如果您的實際方法正在執行某種 I/O 操作,例如網絡請求或寫入文件,您可以重寫它以使用異步方法。 但是,如果它正在執行 CPU 繁重的工作,或者您只是無法重寫它,那么您就會堅持它是同步的 - 它在當前線程運行時阻塞它。

但是,您可以並行運行FunctionReturningVoid (在另一個線程上)並異步等待它(因此它不會阻塞當前線程)。 如果這是一個桌面應用程序,這將是明智的——你不想在它運行時鎖定你的 UI。

為此,您可以使用Task.Run ,它將開始在另一個線程上運行代碼並返回一個Task ,您可以使用它來了解它何時完成。 這意味着您的WrapperFunction將如下所示:

public Task WrapperFunction()
{
    return Task.Run(() => this.FunctionReturningVoid("aParameter"));
}

旁白:請注意,我刪除了async關鍵字。 這不是必需的,因為您可以將Task傳遞給調用方法。 有更多關於這里的信息。

Microsoft 有一些關於使用 async 和 await 進行異步編程的好文章值得一讀。

暫無
暫無

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

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