我有一個類Reader
創建Task
並批量讀取數據。每次完成讀取批次時,都會通過傳入參數IProgress
報告進度。然後我將這批保存到NoSQL數據庫。問題是它有時可以比將批次保存到數據庫更快地報告進度。塊異步任務
我認爲如果保存尚未完成,一個好的解決方案是阻止Task
。我真的不知道如何實現它。我需要的東西會通知閱讀已完成,然後等待通知保存到數據庫已完成,並且可以繼續閱讀。
僞代碼:
讀者:
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