[英]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))
兩件事情:
await
關鍵字將等待操作完成。 bool
可以在條件中使用,但是Task<bool>
不能。 您可以像這樣同步進行:
if(AsyncMethod(param).Result)
{
//Do something
}
希望它有所幫助;)
await
async
方法將導致調用線程從方法調用方返回,直到異步方法完成。 方法完成后,調用線程(在同步上下文中)將切換回停止的位置。 如果沒有同步上下文,await方法仍將返回給調用者,並且將恢復調用方法的執行(但不一定在最初調用它的同一線程上)。 無論返回類型/值如何,都會發生這種情況。
在你的情況下(假設語法是正確的)。 SomeMethod
(你需要add())將調用AsyncMethod
並立即返回。 AsyncMethod
完成后, SomeMethod
將切換回停止的位置,即評估返回值( true
或false
)。 如果值為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.