簡體   English   中英

在不等待的情況下調用異步方法 #2

[英]call async method without await #2

我有一個異步方法:

public async Task<bool> ValidateRequestAsync(string userName, string password)
{
    using (HttpClient client = new HttpClient())
    {
        HttpResponseMessage response = await client.GetAsync(url);
        string stringResponse = await response.Content.ReadAsStringAsync();

        return bool.Parse(stringResponse);
    }
}

我這樣稱呼這個方法:

bool isValid = await ValidateRequestAsync("user1", "pass1");

我可以在不使用await關鍵字的情況下從同步方法調用相同的方法嗎?

前任:

public bool ValidateRequest(string userName, string password)
{
    return ValidateRequestAsync(userName, password).Result;
}

我認為這會導致僵局。

編輯

調用上面的方法使調用永不結束。 (該方法不再結束)

如果從單線程執行上下文(例如 UI 線程)調用異步方法,並同步等待結果,則死鎖的可能性很高。 在您的示例中,該概率為 100%

想想看。 當你打電話時會發生什么

ValidateRequestAsync(userName, password).Result

您調用方法 ValidateRequestAsync。 在那里你調用 ReadAsStringAsync。 結果是一個任務將被返回到 UI 線程,當它變得可用時,一個延續被安排在 UI 線程上繼續執行。 但當然,它永遠不會變得可用,因為它正在等待(阻塞)任務完成。 但是任務無法完成,因為它正在等待 UI 線程變為可用。 僵局。

有一些方法可以防止這種僵局,但它們都是一個壞主意。 為了完整起見,以下可能有效:

Task.Run(async () => await ValidateRequestAsync(userName, password)).Result;

這是一個壞主意,因為您仍然會阻止 UI 線程等待並且沒有做任何有用的事情。

那么有什么解決辦法呢? 一路異步。 UI 線程上的原始調用者可能是某個事件處理程序,因此請確保它是異步的。

你可以使用return ValidateRequestAsync(userName, password).GetAwaiter().GetResult();

對我來說,它在異步調用中使用 .ConfigureAwait(false) 設置工作。 我有類似的東西

return await Entities.SingleOrDefaultAsync(.....).ConfigureAwait(false);

暫無
暫無

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

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