当前位置:  开发笔记 > 编程语言 > 正文

await语句后的代码未运行

如何解决《await语句后的代码未运行》经验,为你挑选了1个好方法。

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

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

        }

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

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

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

            return task;
        }
    }

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



1> Kirill Shlen..:

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

Task TestTask()
{
    return Task.Run(() =>
    {
        Thread.Sleep(2000);
        return "TestTask";
    });
}

或者更好的选择:

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

    return "TestTask";
}

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

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


一般规则是:如果你需要在第一次`await`之后触摸UI,*不要*使用`ConfigureAwait(false)` - 只需`等待`你的`Task`.如果您不需要触摸UI,请使用它.
推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有