【发布时间】:2018-09-03 00:53:44
【问题描述】:
我需要同时执行许多方法并将所有方法的结果连接到一个列表中。在下面的示例中,我为每种方法等待 3 秒,但在其中一个方法中,我添加了一个睡眠(10 秒)来检查结果,它不是预期的。该方法永远不会取消并等待这 10 秒。问题是什么?谢谢!
var result = await Task.Run(() => Load<MyCustomClass>(OneMethod(), OtherMethod()));
private List<T> OneMethod()
{
return new List<T>();
}
private List<T> OtherMethod()
{
Thread.Sleep(10000);
return new List<T>();
}
private async Task<List<T>> Load<T>(params List<T>[] taskList)
{
try
{
return (await Task.WhenAll(taskList.Select(x =>
Task.Run(() => x, new CancellationTokenSource(3000).Token)))).SelectMany(x => x).ToList();
}
catch (Exception currentException)
{
//BLA BLA BLA
}
return new List<T>();
}
【问题讨论】:
-
您正在使用
Thread.Sleep(),而您应该使用基于任务的等效项Task.Delay() -
可以去掉第一个
await Task.Run(() => Load..写await Load.. -
@AndrewWilliamson 嗨,感谢您的帮助。但我有同样的结果。我添加了 30 秒的延迟,但它一直在发生。
-
@Max 您好,感谢您的帮助。但我有同样的结果。
-
为什么是
Task.Run?
标签: c# wpf asynchronous async-await