質問を正しく理解できれば、A タスクを開始するときにカウンターをインクリメントし、各タスクが完了すると、イベント ハンドラーでカウンターをデクリメントします。また、イベント ハンドラーでは、(カウンターをデクリメントした後) カウンターがゼロかどうかを確認します。その場合、タスク B を実行します。
Tasks (別名 "Task Parallel Library (TPL)" )を見ることをお勧めします。これにより、次のようなことができます。
Task.WhenAll( new Task[] {
Task.Run(()=> { //... do work A1... },
Task.Run(()=> { //... do work A2... },
Task.Run(()=> { //... do work A3... }})
.ContinueWith(()=> {//... do work B... });
更新:以下のコメントでの WPF アニメーションの言及に基づいて、Task.Run
ここでは適切ではない可能性があります。私の記憶が正しければ、Completed
イベントを取得し、コード内でアニメーションを同期的に実行する方法がありません (「... do work A1...」のように)。
ただし、 を介してタスクを作成する代わりに、次のような拡張メソッドを介してのイベントTask.Run
からタスクを作成できます。Completed
Storyboard
public static Task<Storyboard> BeginAsync(this Storyboard sb)
{
var tcs = new TaskCompletionSource<Storyboard>();
sb.Completed += (s, a) => tcs.TrySetResult(sb);
sb.Begin();
return tcs.Task;
}
このメソッドは、ストーリーボードのCompleted
イベント ハンドラーで完了するタスクを作成し、タスクを返す前にストーリーボード アニメーションを開始することに注意してください。また、他のタイプやイベントについても同様の拡張メソッドを記述できることに注意してください。
たとえば、次のようにこのメソッドを使用します。
var sb1 = (Storyboard)mainWindow.FindResource("Storyboard1");
var sb2 = (Storyboard)mainWindow.FindResource("Storyboard2");
var sb3 = (Storyboard)mainWindow.FindResource("Storyboard3");
Task.WhenAll( new Task[] {
sb1.BeginAsync(),
sb2.BeginAsync(),
sb3.BeginAsync() })
.ContinueWith(() => MessageBox.Show("All done!"),
TaskScheduler.FromCurrentSynchronizationContext());
TaskScheduler.FromCurrentSynchronizationContext()
基本的に、継続タスクを UI スレッドで実行するようにスケジュールします (これは、UI 要素にアクセスする場合に必要です)。