await语句后的代码未运行

All*_*ech 1 c# wpf asynchronous async-await

我知道论坛里有很多类似的问题,但我没有找到和我一样的问题.请看下面的代码.

public class MainViewModel
    {
        public MainViewModel()
        {
            Test();

        }

        async Task<string> Test()
        {
            var v = await TaskCaller();
            return v;
        }

        Task<string> TestTask()
        {
            new Task<string>(() =>
            {
                Thread.Sleep(2000);
                return "TestTask";
            });
            return null;
        }

        Task<string> TaskCaller()
        {
            var task = new Task<string>(() =>
            {
                return TestTask().Result;
            });

            return task;
        }
    }
Run Code Online (Sandbox Code Playgroud)

永远不会达到return v语句.我需要TaskCaller的结果来做更多的过程.

Kir*_*kiy 6

你没有开始任何任务,所以他们无法完成任务(他们将永远被困住Status = TaskStatus.Created).由于这些任务无法完成,您await将无限期地等待.使用Task.Run,返回(已启动)任务,以便在线程池上安排工作,即:

Task<string> TestTask()
{
    return Task.Run(() =>
    {
        Thread.Sleep(2000);
        return "TestTask";
    });
}
Run Code Online (Sandbox Code Playgroud)

或者更好的选择:

async Task<string> TestTask()
{
    await Task.Delay(2000).ConfigureAwait(false);

    return "TestTask";
}
Run Code Online (Sandbox Code Playgroud)

请注意,您TaskCaller实际返回null Task.这显然是一个错误.

另外:不要通过Task.Wait()或阻止任务Task.Result

  • 一般规则是:如果你需要在第一次`await`之后触摸UI,*不要*使用`ConfigureAwait(false)` - 只需`等待`你的`Task`.如果您不需要触摸UI,请使用它. (2认同)