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

C# 等待不调用我的方法,它将永远不会返回,c#,.net,task-parallel-library,async-await,c#-5.0,C#,.net,Task Parallel Library,Async Await,C# 5.0,我有以下使用异步等待的代码 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> t

我有以下使用异步等待的代码

    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();
    }
private async void DoAction()
{
foreach(新int[]{1,2,3,4,5}中的varele)
{
int i=等待加载操作();
}
}
私有任务LoadAction()
{
Task Task=新任务(称为FromAsync);
返回任务;
}
私有int CalledFromAsync()
{
《睡眠》(2000年);
返回rand.Next();
}

我的CalledFromAsync()从未被调用。我做错什么了吗?请帮帮我。

您返回的任务从未开始过。它也从未完成,这并不奇怪。您需要使用
task.Start()
启动任务,或任何其他工厂方法,如
任务。运行

,如mark所述,使用
任务
构造函数返回处于“已创建”状态的“冷任务”,该任务尚未开始执行。 启动
任务时,应始终使用
Task.Run
Task.Factory.Startnew
,后者始终返回“热任务”

从:

任务状态:

为了支持从
Task
Task
派生的类型的角案例,并支持构建与调度的分离,Task类公开了一个
Start
方法。由公共任务构造函数创建的任务称为冷任务,因为它们在非计划创建状态下开始其生命周期,并且仅在对这些实例调用Start时才计划。所有其他任务在热状态下开始其生命周期,这意味着它们所代表的异步操作已经启动,并且它们的任务状态是一个枚举值,而不是
TaskStatus.Created
必须激活从TAP方法返回的所有任务。如果TAP方法在内部使用任务的构造函数实例化要返回的任务,则TAP方法必须在返回任务对象之前对其调用Start。TAP方法的使用者可以安全地假定返回的任务处于活动状态,并且不应尝试对从TAP方法返回的任何任务调用Start。对活动任务调用Start会导致
InvalidOperationException
异常


请注意,虽然这是一个有趣的示例,但对于
async
,这不一定是一个理想的用例。我希望“wait”本身启动任务。不正确吗?@adinaryana不,
wait
是一种在任务完成后返回代码行的机制,可以选择使用相同的
SynchronizationContext
,它与启动等待完成的任务无关。@adinaryana请记住,大多数时候,你等待的不是CPU,而是外部资源(文件、网络等);所以没有什么可以“开始”@MarcGravel感谢您的及时回复。现在我明白了等待只是等待任务完成,对任务什么也不做。@Adinarayana重要:
wait
不“等待”;它将某件事安排为一个延续,在完成时完成'