【发布时间】:2017-07-21 19:03:42
【问题描述】:
我正在尝试为我的视图模型创建一个辅助方法,该方法需要执行一组操作,并将阻止同时发生的其他操作集合。
我相信这是使用Task.ContinueWith 的主要候选者,并且我的原始硬编码功能使用此方法没有问题,但是当我尝试在运行时构建操作时,我遇到了一个问题,因为我的任务正在运行与我预期的不同。
我的班级看起来像:
internal abstract class ViewModel : IViewModel
{
private readonly AutoResetEvent autoResetEvent = new AutoResetEvent(true);
protected Task SynchronousTask(IList<Action> actions)
{
var initialTask = new Task(() => this.autoResetEvent.WaitOne());
for (var i = 0; i < actions.Count; i++)
{
var i1 = i;
initialTask.ContinueWith(task => actions[i1]());
}
initialTask.ContinueWith(task => this.autoResetEvent.Set());
initialTask.Start();
return initialTask;
}
}
基本上我想等待AutoResetEvent 阻止任何正在运行的新任务,直到它被设置为止。然后,我循环遍历每个任务,将它们添加为初始任务的延续,最后以设置AutoResetEvent 的延续结束它。
在我看来,理论上它应该可以工作,但是当我运行它时,我最终会以不正确的顺序运行延续。
我知道有其他方法可以在不使用 ContinueWiths 的情况下做到这一点,但我想看看我在哪里以及如何使用这种方法出错。
【问题讨论】:
-
如果您在循环中简单地使用
await Task.Run(action),您可以摆脱所有这些代码。调用者将在执行到达第一个await时返回一个任务。不需要事件或冷任务。 -
@PanagiotisKanavos 是的,我同意这会更好,并希望这是人们将来会做的事情,但我主要担心的是我哪里出错了,现在我看到这是一个愚蠢的疏忽。
标签: c# asynchronous task