タスクを順番に実行するようにスケジュールする方法を見つけようとしています。私がこれまでに出てきた解決策は以下に掲載されていますが、私はそれがはるかに簡単で効率的な方法で行うことができるという疑いがあります。C#タスクをシーケンスで実行する効率的な方法
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ポートをスキャンして(他の)リーダーを見つけるもう1つの方法。場合によっては、リーダースキャンを使用してポートスキャンを行い、接続を復元することがあります。これはまさに私が共起したくない2つの「ポートスキャン」タスクです。
これは、2つのタスクを同時に実行したくないという状況にどのようになったのかを明確にしたいと考えています。さて、この質問に答えることを避ける別の方法があるかもしれません。しかし、私はまだあなたならば良い解決策は、C#4の上に、あなたがあなたのキューの
またはC4で見て、他の同時*クラスを持つスレッドセーフであるConcurrentQueue
クラスができた:)
したがって、タスクを同期して実行したいですか?どのようにあなたはこの場所にあなた自身を得ましたか?あなたは取り返して、アクションだけを使うことができますか? – Will
それは良い質問です。私は少しこれについて詳しく説明するために投稿を編集します。 – bvh