私は現在、数千のファイルを保持する大きなバイナリ ファイルから読み取るアプリケーションを使用しており、すべてのファイルはアプリケーション内の他のクラスによって処理されています。このクラスは、オブジェクトまたは 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データフロー全体に不慣れなので、2番目のコードスニペットでは機能し、最初のスニペットでは機能しない理由について誰かが光を共有できることを願っています.
敬具、マルティン