Task
を作成し、バッチでデータを読み取るクラスReader
があります。バッチの読み込みが完了するたびに、IProgress
によって進捗がパラメータとして渡されます。次に、バッチをNoSQLデータベースに保存します。問題は、バッチをデータベースに保存するよりも速く進行状況を報告できることです。ブロック非同期タスク
保存がまだ完了していない場合は、Task
をブロックするのがよい解決策だと思います。私はそれをどのように実装するのか本当に分かりません。私は読書が終わったことを知らせる何かが必要で、dbへの保存が終了して読書を続けるという通知を待つ。
擬似コード:
リーダー:
public async Task<bool> ReadAsync(IProgress<Tuple<DataTable, int>> statusCallback) {
return await Task.Run(() =>
{
while(lineCount <= BufferSize) {
// Read data
}
statusCallback.Report(new Tuple<DataTable, int>(data, progress);
}
}
メイン:
public Main() {
var progress = new Progress<Tuple<DataTable, int>>(ReaderStatusCallback);
reader.ReadAsync(progress);
}
private void ReaderStatusCallback(Tuple<DataTable, int> tuple)
{
var data = tuple.Item1.ToDocumentData();
var progress = tuple.Item2;
_progressBar.Increment(progress);
_docData.Data = data;
_repository.Add(_docData);
}
保存タスクも非同期ですか? – Sparrow
いいえ、UIスレッド – FCin
に保存します。擬似コードを投稿していればアイデアを出しやすくなります。私は読者クラスがループを使用していると仮定しています。おそらく、保存のためのシングルトンクラスを持つことができ、それがビジーであるかどうかを示すフラグを持っていて、リーダーループで新しいバッチを読み込む前にそのフラグをチェックしてください。あなたは気が散ってイベントを使って、保存が終わったときに読者のクラスに知らせることができます。あるいはループを使用して、準備ができるまでフラグの値を絶えずチェックすることができます。非同期メソッドを待っている(またはブロックしている)のは、非同期プログラミングのアイデアとは多少異なりますが、 – Sparrow