1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【C#】Timerを使ってタイムアウト処理を書く

Last updated at Posted at 2024-10-24

Timerを使っていろいろやってみたんですが

サンプルコード

マイクロソフトの公式サイトのサンプルコードを参考に作成しました。
※あくまでも使用例のイメージなのでコンパイルは通していません。コンパイルエラー出たらごめんなさい。
https://learn.microsoft.com/ja-jp/dotnet/api/system.timers.timer?view=net-8.0

サンプルコード

Timer2.cs
using System;
using System.Timers;
using System.Threading;
// Timer 自体は System.Threading にも存在するので明示しておく
using Timer = System.Timers.Timer;
public class Example
{
    private static Timer aTimer = null!;
    private static bool IsTimer = false;

    public static void Main()
    {
        SetTimer();

        aTimer.Enabled = true;         //タイマー開始
        IsTimer = true;
        while (IsTimer)
        {
            //最適化でwhile処理が省略されてしまうのを防ぐ
            //Sleepを使っているが、UIが固まることがないのでおすすめ
            Thread.Sleep(1);
        }

        //2000ms経過したらループを抜けて以下の処理をする
        IsTimer = false;
        aTimer.Enabled = false;

        Console.WriteLine("終了");
    }

    private static void SetTimer()
    {
        // Create a timer with a two second interval.
        //aTimer.Intervalで時間指定もできる
        aTimer = new Timer(2000);

        // Hook up the Elapsed event for the timer. 
        aTimer.Elapsed += OnTimedEvent;
        aTimer.AutoReset = false;      //タイマーを繰り返すか否か
        aTimer.Enabled = false;
    }

    //タイマーでセットした時間が経過したらこのイベントが呼ばれる
    private static void OnTimedEvent(object? source, ElapsedEventArgs e)
    {
        IsTimer = false;
        aTimer.Enabled = false;
    }
}

別スレッドの処理が終わるまで待ちたいときもこれが使える。
他のスレッドの処理内で、処理が終わったらIsTimerフラグをfalseにしてあげればよいかなと思う。
何かしらの原因で無限ループになってフリーズしないためにもタイマーでタイムアウト処理は各必要がある。

1
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?