等待不调用我的方法,它永远不会返回

时间:2014-07-11 03:28:16

标签: c# .net task-parallel-library async-await c#-5.0

我有以下使用async等待的代码。

    private async void DoAction()
    {
        foreach (var ele in new int[] { 1, 2, 3, 4, 5 })
        {
            int i = await LoadAction();
        }
    }

    private Task<int> LoadAction()
    {
        Task<int> task = new Task<int>(CalledFromAsync);
        return task;
    }

    private int CalledFromAsync()
    {
        Thread.Sleep(2000);
        return rand.Next();
    }

永远不会调用我的CalledFromAsync()。我在这里做错了吗?请帮帮我。

2 个答案:

答案 0 :(得分:6)

您正在返回一个永远不会开始的任务。它永远不会完成也不足为奇。您需要使用task.Start();来启动任务,或使用任何其他工厂方法,例如Task.Run

答案 1 :(得分:3)

正如mark所说,使用Task构造函数返回“已创建”状态的“冷任务”,该状态尚未开始执行。  在发起Task.Run时,您应始终使用Task.Factory.StartnewTask,这始终会返回“热门任务”。

来自TAP Guidlines

  

任务状态:

     

为了支持派生自TaskTask<TResult>的类型的极端情况,并支持将构造与调度分离,Task类公开了Start方法。由公共任务构造函数创建的任务称为冷任务,因为它们以非调度的创建状态开始其生命周期,并且仅在这些实例上调用Start时进行调度。所有其他任务在热状态下开始其生命周期,这意味着它们表示的异步操作已经启动,其任务状态是除TaskStatus.Created以外的枚举值。 必须激活从TAP方法返回的所有任务。如果TAP方法在内部使用任务的构造函数来实例化要返回的任务,则TAP方法必须在返回之前调用Task对象上的Start。 TAP方法的使用者可以安全地假设返回的任务是活动的并且不应该尝试在从TAP方法返回的任何任务上调用Start。在活动任务上调用Start会导致InvalidOperationException异常。