C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.55216 の関連記事表示

<< 0 >>
■55216  Re[2]: Parallel.For と Invoke メソッドの使い方
□投稿者/ kait -(2010/11/22(Mon) 10:13:43)
    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();
        }
    }
    
    結果、変わりありませんでした。
    停止する場所は不定で、最後まで完走することもあります。
    
    さらにお気づきの点がございましたら、ご指摘いただけますと幸いです。
    よろしくお願いいたします。
記事No.55213 のレス /過去ログ92より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -