プログラムを書こう!

実務や自作アプリ開発で習得した役に立つソフトウェア技術情報を発信するブログ

C#でスレッドを待機させる。

この記事は2019年03月09日に投稿しました。

f:id:paveway:20190914064630j:plain

目次

  1. はじめに
  2. C#でスレッドを待機させる
  3. おわりに

基礎からしっかり学ぶC#の教科書

基礎からしっかり学ぶC#の教科書

1. はじめに

こんにちは、iOSのエディタアプリPWEditorの開発者の二俣です。
今回は業務で使用しているC#でスレッドを待機させる方法についてです。

目次へ

2. C#でスレッドを待機させる

C#でスレッドを待機させる方法はいくつかあると思いますが、今回はManualResetEventを使用します。

実装例

実装例の動作
非同期のタスクをマニュアルリセットイベントのシグナル待ちにしておきます。
ボタンを押下し、シグナル状態にします。
シグナル状態になるとタスクの待機状態が解除され、ラベルを更新します。

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

namespace SampleManualResetEvent
{
    public partial class Form1 : Form
    {
        // マニュアルリセットイベントを作成します。
        private ManualResetEvent mre = new ManualResetEvent(false);

        private int count = 0;

        public Form1()
        {
            InitializeComponent();

            // 非同期処理を開始します。
            Task.Run(() =>
            {
                while (true)
                {
                    // シグナル状態になるのを待ちます。
                    mre.WaitOne();

                    // ラベルの表示を更新します。
                    this.Invoke(new MethodInvoker(delegate
                    {
                        lblMessage.Text = "Button press count = " + ++count;
                    }));

                    // シグナル状態をリセットします。
                    mre.Reset();
                }
            });
        }

        private void btnCountUp_Click(object sender, EventArgs e)
        {
            // シグナル状態にします。
            mre.Set();
        }
    }
}

目次へ

3. おわりに

業務で使用しているツールをリプレースしようと思い、勉強がてらC#で作ることにしました。
スレッド処理の待機解除に今回のManualResetEventを使用してみました。

GEEK JOB

独習C# 新版

独習C# 新版

紹介している一部の記事のコードはGitlabで公開しています。
興味のある方は覗いてみてください。

目次へ


私が勤務しているニューラルでは、主に組み込み系ソフトの開発を行っております。
弊社製品のハイブリッドOS Bi-OSは高い技術力を評価されており、特に制御系や通信系を得意としています。
私自身はiOSモバイルアプリウィンドウズアプリを得意としております。
ソフトウェア開発に関して相談などございましたら、お気軽にご連絡ください。

また一緒に働きたい技術者の方も随時募集中です。
興味がありましたらご連絡ください。

EMAIL : info-nr@newral.co.jp / m-futamata@newral.co.jp
TEL : 042-523-3663
FAX : 042-540-1688

目次へ