首页 > 解决方案 > 异步方法不将控制权返回给调用方方法

问题描述

我有以下代码

class Program
{
    public  async  Task<bool> StartMyTask()
    {
        await Foo();

        return true;

    }

    public async Task<bool> Foo()
    {

        for (int i = 0; i < 1000000; i++)
        {
            Console.WriteLine("Loop");
        }
        return true;

    }


    static void Main(string[] args)
    {
        Program obj = new Program();

        var myTask = obj.StartMyTask();     
        Console.WriteLine("Before Task Return");                                    


        Console.ReadLine();
    }
}

根据我的理解,当调用“await Foo()”时,将创建一个线程来执行“Foo()”方法,并将控制权返回给调用者(Main 方法)。

考虑到这一点,应该在“Foo()”方法完成之前打印“Before Task Return”。但它没有发生,首先“Foo()”方法完成,然后显示“任务返回之前”。

标签: c#multithreadingasync-await

解决方案


根据我的理解,当调用“await Foo()”时,将创建一个线程来执行“Foo()”方法,并将控制权返回给调用者(Main 方法)。

不,绝对不是。async并且await不要自己创建线程。async允许您使用await,await并将“异步等待” - 即暂停方法,返回,然后在其操作完成时恢复该方法

请注意,编译器会警告您已标记了一个方法,async它将同步运行。所以编译器已经准确地告诉你出了什么问题。

如果使用后台线程,可以使用Task.Run调用同步Foo方法:

public async Task<bool> StartMyTask()
{
  await Task.Run(() => Foo());
  return true;
}

public bool Foo()
{
  for (int i = 0; i < 1000000; i++)
  {
    Console.WriteLine("Loop");
  }
  return true;
}

推荐阅读