排他制御
- 題名: 排他制御
- 著者: そーですねぃ
- 日時: 2006/10/03 14:59:19
- ID: 17771
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[2]: 排他制御
- 著者: そーですねぃ
- 日時: 2006/10/04 9:34:30
- ID: 17777
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[4]: 排他制御
- 著者: そーですねぃ
- 日時: 2006/10/04 10:35:27
- ID: 17781
- この記事の返信元:
- この記事への返信:
- ツリーを表示
分類:[.NET]
お世話になります。
下記のコードにてコンソール画面の排他制御を企てています。
タイマにて500msごと、ボタンにて非同期に、Outputメソッド
を実行します。
タイマにてOutputメソッド実行している間にボタンを押した
場合にはボタン押下によるOutputメソッドはlockにより実行
を拒否され、出力結果は button: 1 〜 button: 5 と timer: 1
〜 timer: 5の組み合わせが交互にあらわれるものと考えて
いました。
が、出力結果は以下の通りです。
lockをMutexに変えてみても同様の結果に終わりました。
何故当方の期待通りの結果にはならないのでしょうか。
お知恵をお貸し願います。宜しくお願い致します。
【コード】
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace misctest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
timer1.Enabled = true;
}
private void button1_Click(object sender, EventArgs e)
{
Output("button");
}
private void timer1_Tick(object sender, EventArgs e)
{
Output("timer ");
}
private bool Output(string param)
{
lock (this)
{
Console.WriteLine("{0}: 1", param);
Application.DoEvents();
Thread.Sleep(100);
Console.WriteLine("{0}: 2", param);
Application.DoEvents();
Thread.Sleep(100);
Console.WriteLine("{0}: 3", param);
Application.DoEvents();
Thread.Sleep(100);
Console.WriteLine("{0}: 4", param);
Application.DoEvents();
Thread.Sleep(100);
Console.WriteLine("{0}: 5", param);
}
return true;
}
}
}
【出力結果】
button: 1
button: 2
button: 3
button: 4
timer : 1
timer : 2
timer : 3
timer : 4
timer : 5
button: 5
timer : 1
timer : 2
timer : 3
timer : 4
timer : 5
timer : 1
timer : 2
timer : 3
timer : 4
button: 1
button: 2
button: 3
button: 4
button: 5
timer : 5