我目前正在处理一个从包含数千个文件的大型二进制文件中读取的应用程序,每个文件都由应用程序中的某个其他类处理。此类返回一个对象或 null。我想在主窗体上显示一个进展,但由于某种原因,我无法理解它。
int TotalFound = 0;
var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext;
BufferBlock<file> buffer = new BufferBlock<file>();
DataflowBlockOptions options = new DataflowBlockOptions(){ TaskScheduler = uiScheduler, };
var producer = new ActionBlock<someObject>(largeFile=>{
var file = GetFileFromLargeFile(largeFile);
if(file !=null){
TotalFound++;
buffer.post(file);
lblProgress.Text = String.Format("{0}", TotalFound);
}
}, options);
上面的代码冻结了我的表单,即使我使用“TaskScheduler.FromCurrentSynchronizationContext”,为什么?因为当我使用下面的代码时,我的表单更新正常
DataflowBlockOptions options = new DataflowBlockOptions(){ TaskScheduler = uiScheduler, };
var producer = new ActionBlock<someObject>(largeFile=>{
var file = GetFileFromLargeFile(largeFile);
if(file !=null){
Task.Factory.StartNew(() => {
TotalFound++;
buffer.Post(file);
}).ContinueWith(uiTask => {
lblProgress.Text = String.Format("{0}", TotalFound);
},CancellationToken.None, TaskContinuationOptions.None, uiScheduler);
}
});
我是整个 TPL 数据流的新手,所以我希望有人可以分享一些关于为什么在第二个代码片段中它有效而在第一个片段中它没有的原因。
亲切的问候,马丁