2008年11月11日火曜日

[.NET]プロセス間の排他制御

以前Log4netにて、複数のプロセスから同じファイルに出力すると言う処理を実装したことがあります。
プロトタイプだったので、良しとしましたが、本来ファイル出力時に他のプロセスが書いていないことを確認してから出力するという処理が必要でしたが、時間もあまり無くそのままにしていました。

その後、正式にプロジェクトはスタートしたのですが、私はプロジェクトを離れたため、その後どうなったのかは不明です。正式版ではなんらか排他制御していると思いますが、当初Mutexを使う予定でした。

以下の例では、同じプログラムを複数実行しても、ロックボタンを押せるのは1つという条件をMutexを使って実装してみました。すごく簡単なので、プロトタイプ作るときにも入れ込んでおけばよかった。。。

public partial class DustCS25Form : Form
{
    private Mutex mutex = null;

    public DustCS25Form()
    {
        InitializeComponent();
    }

    /// <summary>
    /// 初期化
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void DustCS25Form_Load(object senderEventArgs e)
    {
        btnLock.Enabled = true;
        btnRelease.Enabled = !btnLock.Enabled;
        textBox1.Text = "初期状態";
    }

    /// <summary>
    /// ロックボタン押下
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btnLock_Click(object senderEventArgs e)
    {
        //2つ目の引数をOS上でユニークにする。
        mutex = new Mutex(falsetextID.Text);

        textBox1.Text = "ロック取得開始";
        //ロックする
        mutex.WaitOne();
        textBox1.Text = "ロック中";

        btnLock.Enabled = false;
        btnRelease.Enabled = !btnLock.Enabled;
    }

    /// <summary>
    /// 解除ボタン押下
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btnRelease_Click(object senderEventArgs e)
    {

        //ロックを解除する
        mutex.ReleaseMutex();
        textBox1.Text = "初期状態";

        btnLock.Enabled = true;
        btnRelease.Enabled = !btnLock.Enabled;
    }

}

0 件のコメント :