簡體   English   中英

沒有掌握C#的任務和等待

[英]Not getting the hang of TASKs and WAIT in C#

我有一堆對Web api的調用,這些調用需要異步調用。 我從未使用過aysnc。

我已經按照以下方式創建了一個簡單的測試控制台程序:

class Program
{
    static void Main(string[] args)
    {
        ClassOne xx = new ClassOne();
        var v1 = xx.DummyTask();
    }
}

該類定義為:

namespace GHTest.classes
{
    public class ClassOne
    {
        GitHubClient client;

        public ClassOne()
        {
           client = new GitHubClient(new ProductHeaderValue("OMHSite"));
        }

        public async Task<string> DummyTask()
        {
            Task<Repository> task = client.Repository.Get("openEHR", "CKM-mirror");
            task.Wait();

            var myResult = task.Result;
            return myResult.FullName;
        }
    }
}

Visual Studio指出我應該使用“ await”運算符,因為當前此代碼將同步運行。 等待操作員去哪里?

此外,如果以下語句引發異常,我該如何在任務中捕獲該異常

client.Repository.Get("openEHR", "CKM-mirror");

task.Wait(); 如果是多余的,則對task.Result的調用將隱式等待。

這是您改寫為使用await方法。

Task<Repository> task = client.Repository.Get("openEHR", "CKM-mirror");
var myResult = await task;

return myResult.FullName;

您不需要.Result ,因為Task<T>上的await類型為T

關於異常處理,您將需要try / catch await (或原始代碼中的Result )。 這樣一來,異常將被重新拋出。 請注意,只有在Task拋出異常時,這才是正確的,從理論上講, Get函數本身可能會拋出該異常,而該異常必須在此處捕獲。

還要注意,由於您要返回async您可以選擇在await調用(或Result )的任何地方捕獲異常。

最后,不要忘記,如果您不await DummyTask的結果, DummyTask您的任務可能不會完成(或Result )。

static void Main(string[] args)
{
    ClassOne xx = new ClassOne();
    var v1 = xx.DummyTask();
    var resultV1 = v1.Result; //Forces the execution of v1 by requesting its result.
}

暫無
暫無

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

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