Я пытаюсь найти способ запланировать выполнение задач в последовательности.Решение, к которому я пришел, опубликовано ниже, но у меня есть подозрение, что оно может быть сделано намного проще / эффективнее.
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.В игре 2 водителя.1 для чтения / записи.Еще один, который может сканировать доступные com-порты по запросу, чтобы найти (другого) читателя.Иногда для восстановления соединения используется сканирование портов с использованием драйвера устройства чтения.Именно эти 2 задачи «сканирования портов» я не хочу выполнять одновременно.
Надеюсь, это проясняет, как я попал в ситуацию, когда 2 задачи не запускались одновременно.Теперь может быть другой выход, избегая необходимости отвечать на этот вопрос.Но мне все еще очень любопытно, каким будет хорошее решение:)