【C#のlockについて】

Boolean型の変数に対し排他制御を行いたいのですが、
解りやすいlockのサイトが見つかりませんでした。
サンプルが掲載されているような参考になるサイトを教えてください。
宜しくお願いします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2011/05/03 11:27:38
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:heke2mee No.1

回答回数162ベストアンサー獲得回数43

ポイント500pt

これでいけると思います。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace TestThreading
{
    public partial class Form1 : Form
    {
        private BackgroundWorker bgWorker;
        delegate void dlgProgress(int percentage);
        bool wait = false;

        private readonly Object lockObject = new Object();  //ロック専用オブジェクト

        private bool IsWait
        {
            set 
            {
                lock (lockObject)
                {
                    wait = value;
                }
            }
            get 
            {
                bool flag = false;
                lock (lockObject)
                {
                    flag = wait;
                }
                return flag;
            }
        }

        public Form1()
        {
            InitializeComponent();
            bgWorker = new BackgroundWorker();
            bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
            bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted);
        }



        private void button1_Click(object sender, EventArgs e)
        {
            this.progressBar1.Value = 0;
            this.button1.Enabled = false;

            bgWorker.RunWorkerAsync();

            this.IsWait = true;
            int count = 0;
            while (this.IsWait)
            {
                count++;
                System.Diagnostics.Debug.WriteLine("loop" + count);
                Application.DoEvents();
            }
            System.Diagnostics.Debug.WriteLine("loop end");

            this.button1.Enabled = true;
            progressBarUpdate(0);
        }

        void bgWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            //時間のかかる処理
            for (int i = 0; i < 10; i++)
            {
                System.Threading.Thread.Sleep(500);
                int percentage = 10 * (i + 1);

                progressBarUpdate(percentage);
            }
        }

        void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            this.IsWait = false;
        }


        /// <summary>
        /// プログレスバーの更新
        /// </summary>
        public void progressBarUpdate(int percentage)
        {
            if (!(this.IsHandleCreated))
            {
                return;
            }
            MethodInvoker process =
                (MethodInvoker)delegate()
                {
                    if (this.progressBar1.Maximum > percentage)
                        this.progressBar1.Value = percentage;
                    else
                        this.progressBar1.Value = 100;
                };
            if (this.InvokeRequired)
            {
                this.Invoke(process);
            }
            else
            {
                process.Invoke();
            }

         }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            bgWorker.DoWork -= new DoWorkEventHandler(bgWorker_DoWork);
            bgWorker.RunWorkerCompleted -= new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted);

            bgWorker.Dispose();
            bgWorker = null;
        }
    }
}

.NETフレームワークのためのC#システムプログラミングの書籍が結構役に立ちますよ

(.NETフレームワークのためのC#システムプログラミング―Visual Studio2008対応)の方が新しいようです。

id:harunoharuno

いつもありがとうございます。ご推薦の本はぜひ購入します。

2011/05/03 11:27:12

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません