| ■No55214 (shu さん) に返信
> ■No55213 (kait さん) に返信
>
> デッドロックが発生しているのではないでしょうか?
> Aの中をlock文を使用して同期を取る必要があるかと思います。
shu さん、ありがとうございます。
Invoke というメソッドはユーザーインターフェーススレッドで実行されると
記述されていたので、その中での同期は必要ないと認識していました。
試しに lock の処理を入れてみました。
このような形でよろしいでしょうか…。
private object lockObject = new object(); // ←ロック用オブジェクト
private void button1_Click(object sender, EventArgs e)
{
this.label1.Text = "0";
for (int i = 0; i < 10; i++)
{
System.Threading.Tasks.Parallel.For(0, 100, n =>
{
Invoke(new MethodInvoker(A));
});
}
MessageBox.Show("owata");
}
private void A()
{
lock (this.lockObject) // ← ロック
{
int value = int.Parse(this.label1.Text);
value++;
this.label1.Text = value.ToString();
Refresh();
}
}
結果、変わりありませんでした。
停止する場所は不定で、最後まで完走することもあります。
さらにお気づきの点がございましたら、ご指摘いただけますと幸いです。
よろしくお願いいたします。 |