我想知道以下代码是否会在执行主线程之前等待异步方法完成,或者只是在条件时继续主线程,并认为方法返回为false。
public async Task<bool> SomeMethod
{
if(await AsyncMethod(param))
{
//Do something
}
}
...
异步方法定义为:
public async Task<bool> AsyncMethod(SomeClass param)
{
//Do something
}
答案 0 :(得分:5)
我想知道以下代码是否会在执行主线程之前等待异步方法完成,或者只是在条件时继续主线程,并认为方法返回为false。
都不是。
await
是“异步等待”。换句话说,方法将等待,但线程将不会。
当你的方法遇到await
时(假设它实际上有一些等待的事情),它会立即将一个不完整的任务返回给SomeMethod
的调用者。线程继续做它想做的事情。稍后,当等待的任务完成时,SomeMethod
将继续执行。 SomeMethod
完成后,之前返回的任务将完成。
我会在blog post on the subject上详细介绍。
答案 1 :(得分:3)
它将等待操作完成。
请注意您如何调用该操作:
if(await AsyncMethod(param))
两件事:
await
关键字,毫不奇怪,等待操作完成。bool
,但Task<bool>
不能。答案 2 :(得分:-1)
await
async
方法将导致调用线程从方法调用方返回,直到异步方法完成。方法完成后,调用线程(在同步上下文中)将切换回停止的位置。如果没有同步上下文,await方法仍将返回给调用者,并且将恢复调用方法的执行(但不一定在最初调用它的同一线程上)。
无论返回类型/值如何,都会发生这种情况。
在您的情况下(假设语法正确)。 SomeMethod
(您需要添加())将调用AsyncMethod
并立即返回。完成AsyncMethod
后,SomeMethod
将切换回停止的位置,即评估返回值(true
或false
)。如果值为true,则调用//执行某些操作,否则将跳过if语句并完成执行SomeMethod
。
以下是没有同步上下文的示例。注意线程id在&#34; await getStringTask&#34;之后发生变化,其余的GetValue在&#34; new&#34;上执行。线程。
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