我正在尝试找到一种按顺序运行任务的方法。目前我想到的解决方案如下,但我怀疑它可以更简单/更高效地完成。
public class SequentialTaskRunner
{
private ISet<Task> runningTasks = new HashSet<Task>();
public void Run(Task task)
{
lock (runningTasks)
{
var tasksToAwait = runningTasks.ToArray();
// create a task that waits for the currently running tasks
var waitingTask = Task.Factory.StartNew(() =>
{
Task.WaitAll(tasksToAwait);
});
// make sure the task gets removed from the running tasks on completion
task.ContinueWith((antecedent2) =>
{
lock (runningTasks)
{
runningTasks.Remove(task);
}
});
// prepend the waiting task
waitingTask.ContinueWith((antecedent) => task.Start());
runningTasks.Add(task);
}
}
}
我想用这个工具来排队处理与com端口连接相关的任务,以防它们互相干扰。
情况如下:我正在使用一个RFID设备。有两个驱动程序在运行。一个用于读/写,另一个可以按请求扫描可用的com端口以查找另一个读取器。有时,将使用读取器驱动程序进行端口扫描以恢复连接。正是这两个“端口扫描”任务,我不希望同时发生。
我希望这样能够澄清我为什么想要两个任务不同时运行的情况。现在,可能还有另一种方法可以避免回答这个问题。但我仍然很好奇一个好的解决方案是什么 :)