Boolean型の変数に対し排他制御を行いたいのですが、
解りやすいlockのサイトが見つかりませんでした。
サンプルが掲載されているような参考になるサイトを教えてください。
宜しくお願いします。
これでいけると思います。
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対応)の方が新しいようです。
いつもありがとうございます。ご推薦の本はぜひ購入します。