各メソッドが非同期に実行される、つまりタスクを返すクラスがありますが、それでも各メソッドは前の呼び出しの完了を待つ必要があります。
続きですよね?
ただし、タスクの継続は、別のタスクではなく、パラメーターでデリゲート (アクション) を取ります。
私はさまざまなことを試しましたが、それを機能させるためにできる最善のことは、次の(私にとっては非常に複雑な)コードです:
private Task QueueTask(Func<Task> futureTask)
{
var completionSource = new TaskCompletionSource<int>();
_lastTask.ContinueWith(async t =>
{
try
{
await futureTask();
completionSource.SetResult(0);
}
catch (Exception ex)
{
completionSource.SetException(ex);
}
});
_lastTask = completionSource.Task;
return _lastTask;
}
ここで _lastTask は、私のクラスのプライベート メンバーです。すべての呼び出しは UI スレッドから来ているので、最後のタスクを保持して継続します。
前述したように、このコードは非常に複雑です。より良い提案はありますか?