繁体   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