簡體   English   中英

異步任務<bool> if條件下的方法調用</bool>

[英]async Task<bool> method call in if condition

我想知道以下代碼是否會在執行主線程之前等待異步方法完成,或者只是在有條件的情況下繼續主線程並將方法返回為 false。

public async Task<bool> SomeMethod
{
    if(await AsyncMethod(param))
    {
        //Do something
    }
}

...

異步方法定義為:

public async Task<bool> AsyncMethod(SomeClass param)
{
   //Do something
}

我想知道以下代碼是否會在執行主線程之前等待異步方法完成,或者只是在條件時繼續主線程並將方法返回為false。

都不是。

await是一種“異步等待”。 換句話說,該方法將等待,但線程不會。

當你的方法遇到await (假設它實際上有一些等待做)時,它會立即將一個不完整的任務返回給SomeMethod的調用者。 線程繼續做它想做的事情。 稍后,當等待的任務完成時, SomeMethod將繼續執行。 SomeMethod完成時,它先前返回的任務將完成。

我在關於這個主題的博客文章中詳細介紹

它將等待操作完成。

請注意您是如何調用該操作的:

if(await AsyncMethod(param))

兩件事情:

  1. 毫無疑問,使用await關鍵字將等待操作完成。
  2. 如果它沒有等待操作完成,則這將是編譯器錯誤。 因為雖然bool可以在條件中使用,但是Task<bool>不能。

您可以像這樣同步進行:

if(AsyncMethod(param).Result)
{
    //Do something
}

希望它有所幫助;)

await async方法將導致調用線程從方法調用方返回,直到異步方法完成。 方法完成后,調用線程(在同步上下文中)將切換回停止的位置。 如果沒有同步上下文,await方法仍將返回給調用者,並且將恢復調用方法的執行(但不一定在最初調用它的同一線程上)。 無論返回類型/值如何,都會發生這種情況。

在你的情況下(假設語法是正確的)。 SomeMethod (你需要add())將調用AsyncMethod並立即返回。 AsyncMethod完成后, SomeMethod將切換回停止的位置,即評估返回值( truefalse )。 如果值為true,它將調用//執行某些操作,否則將跳過if語句並完成執行SomeMethod

以下是沒有同步上下文的示例。 注意線程id在“await getStringTask”之后發生了變化,其余的GetValue在“new”線程上執行。

    private static void Main(string[] args)
    {
        GetValue();
        Console.WriteLine("test1");
        Console.WriteLine("1 " + Thread.CurrentThread.ManagedThreadId);
        Console.ReadKey();
    }

    private static async void GetValue()
    {
        Console.WriteLine(await AccessTheWebAsync());
        Console.WriteLine("2 " + Thread.CurrentThread.ManagedThreadId);
        Console.WriteLine("test2");
        Console.WriteLine("3 " + Thread.CurrentThread.ManagedThreadId);
    }

    private static async Task<int> AccessTheWebAsync()
    {
        HttpClient client = new HttpClient();
        Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");
        Console.WriteLine("4 " + Thread.CurrentThread.ManagedThreadId);
        string urlContents = await getStringTask;
        Console.WriteLine("5 " + Thread.CurrentThread.ManagedThreadId);
        return urlContents.Length;
    }

打印

4 9
test1
1 9
5 13
47984
2 13
test2
3 13

暫無
暫無

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

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