我有一个类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