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
不“等待”;它将某件事安排为一个延续,在完成时完成'