人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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


●質問者: harunoharuno
●カテゴリ:コンピュータ インターネット
✍キーワード:C# サイト 変数 排他制御
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● heke2mee
●500ポイント ベストアンサー

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

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対応)の方が新しいようです。

◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ