UIの更新にかなりの時間がかかるとします。一例として、このダミーラベルはテキストを変更するのに1秒かかります。コントロールのSynchronizationContextポストキューの最後のもの以外の破棄
public class MyLabel : Label
{
public override string Text
{
get { return base.Text; }
set
{
Debug.WriteLine("Setting " + value);
Thread.Sleep(1000);
base.Text = value;
}
}
}
更新するタスクが複数ある場合は、それらの投稿がキューに入れられているようです。
var UIContext = SynchronizationContext.Current;
for (int i = 0; i < 10; i++)
{
Task.Factory.StartNew((id) =>
{
Debug.WriteLine(id);
Thread.Sleep((int)id*100);
UIContext.Post((label) =>
{
myLabel1.Text = label.ToString();
}, id);
}, i);
}
ラベルはポストがキューイングされている受信ようで、ラベルは最終的にそれらをすべて受信しますが、以前のものは取り扱われない必要ように、この例では、次のものが前のものを上書きします。理想的には、私は最後のもの以外のすべての投稿を無視したいと思います。キューに入れられたアイテムを確認して削除できますか?
あなたはタイムマシンを求めています。彼らは実生活のようにソフトウェアで構築するのが難しいです。そうでなければ非常に単純な問題です。実行しなければならないジョブに追いつかないユーザーインターフェイスは、使用できないユーザーインターフェイスです。ユーザーはプログラムの制御を失い、タスクマネージャに頼らなくてもプログラムを終了することはできません。これは*バグ*ですが、修正する必要があります。 –
同期コンテキストにポストするのではなく、 'Progress'を使用してはいけませんか? –