C# WPF アプリケーションでは、次のボタンでイベント habdler をクリックします。
private void start_Click(object sender, RoutedEventArgs e)
{
for (int i = 2; i < 20; i++)
{
var t = Task.Factory.StartNew
(() =>
{
var result=Thread.CurrentThread.ManagedThreadId.ToString();
//this.Dispatcher.BeginInvoke(new Action(() =>
textBlock1.Text += "root " + i.ToString() + " " +
result + Environment.NewLine
;//to comment this line if to uncomment th others
//), null);
}
);
}
}
コメント化された行のコメントを外します。つまり、テキストブロックに出力するDispatcher.BeginInvoke()
と、さまざまなスレッド ID で埋められます。
上記のようにコメント行がありますが、テキストブロックは空白のままで、例外はスローされません。
同様の状況でParallel.For
private void start_Click(object sender, RoutedEventArgs e)
{
Parallel.For(2, 6, (i)
=> {
var result = Thread.CurrentThread.ManagedThreadId.ToString();
textBlock1.Text += "root " + i.ToString() + " " +
result + Environment.NewLine;
} );
}
アプリケーションは例外で壊れます:
「別のスレッドが所有しているため、呼び出し元のスレッドはこのオブジェクトにアクセスできません」
を使用しているときに、最初のケースでスローされないのはなぜTask.Factory.StartNew()
ですか?
この例外を確実にする方法はありますか?