异步任务<bool>方法调用if条件

时间:2016-03-08 16:44:29

标签: c# .net if-statement asynchronous async-await

我想知道以下代码是否会在执行主线程之前等待异步方法完成,或者只是在条件时继续主线程,并认为方法返回为false。

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

...

异步方法定义为:

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

3 个答案:

答案 0 :(得分:5)

  

我想知道以下代码是否会在执行主线程之前等待异步方法完成,或者只是在条件时继续主线程,并认为方法返回为false。

都不是。

await是“异步等待”。换句话说,方法将等待,但线程将不会。

当你的方法遇到await时(假设它实际上有一些等待的事情),它会立即将一个不完整的任务返回给SomeMethod的调用者。线程继续做它想做的事情。稍后,当等待的任务完成时,SomeMethod将继续执行。 SomeMethod完成后,之前返回的任务将完成。

我会在blog post on the subject上详细介绍。

答案 1 :(得分:3)

它将等待操作完成。

请注意您如何调用该操作:

if(await AsyncMethod(param))

两件事:

  1. 使用await关键字,毫不奇怪,等待操作完成。
  2. 如果没有等待操作完成,那么这将是编译器错误。因为虽然可以在条件中使用bool,但Task<bool>不能。

答案 2 :(得分:-1)

await async方法将导致调用线程从方法调用方返回,直到异步方法完成。方法完成后,调用线程(在同步上下文中)将切换回停止的位置。如果没有同步上下文,await方法仍将返回给调用者,并且将恢复调用方法的执行(但不一定在最初调用它的同一线程上)。 无论返回类型/值如何,都会发生这种情况。

在您的情况下(假设语法正确)。 SomeMethod(您需要添加())将调用AsyncMethod并立即返回。完成AsyncMethod后,SomeMethod将切换回停止的位置,即评估返回值(truefalse)。如果值为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