0

スレッドが X 秒以上実行されているときに何かを実行できるロジックが必要です。

この信じられないほど醜い例のように、ここでは毎秒チェックし、workerThreadが 10 分以上実行されている場合はメッセージを表示します...

var timeWorking = TimeSpan.FromMinutes(0);
workerThread = new Thread(RunTask);
workerThread.Start(task);
while (workerThread.IsAlive)
{
    Thread.Sleep(TimeSpan.FromSeconds(1));
    timeWorking = timeWorking.Add(TimeSpan.FromSeconds(1));
    if (timeWorking.TotalMinutes < 10) continue;
    timeWorking = TimeSpan.FromMinutes(0);
    Console.Writeline("Here we go... the event")
}

それを正しくするのを手伝ってください...何を使用すればよいDiagnostics.StopWatchですSystem.Timers.TimerThreading.Timer

UPD: すべての答えが私をさらに混乱させました...

タスクは、workerThreadが X 時間以上実行されているかどうかを確認することです。実行されている場合は、何らかのメソッドを呼び出し、タイマーをリセットしworkerThreadて、最後にメソッドを呼び出してから X 時間以上実行されているかどうかをもう一度確認します。 ...などなど...

UPD2: 基本的に、AmazonSQS キューから取得した情報に基づいて処理を行うスレッドがあります。SQS キュー メッセージに可視性タイムアウトがあります。タスクがデフォルトの表示タイムアウトよりも長くかかる場合、メッセージはタスクが完了する前にキューに戻されます。そして、それは別のマシンによってピックアップされます。これを回避するには、SQS メッセージの可視性タイムアウトを延長する必要があります。そのため、スレッドが停止しているかどうかを定期的にチェックすることでisALive、メッセージの表示タイムアウトに数分を追加できます。1 分 50 秒ほど経過したら、もう一度確認し、スレッドがまだ残っている場合はisALiveさらに数分追加する必要があります。

4

5 に答える 5

2

あなたが説明したことに基づいて、System.Timers.Timerの方が適していると思います。しかし、それは依存します。タイマー付きのUIで何かをしたい場合。Forms.Timer の方が優れています。

どちらの場合でも、タイマーが経過した (またはティックされた) ときにスレッドがまだ生きているかどうかを確認し、生きている場合は何かを行うことができます。

例えば

    timeThreadStarted = DateTime.Now;
    workerThread = new Thread(RunTask);
    System.Timers.Timer timer = new System.Timers.Timer(TimeSpan.FromSeconds(1).TotalMilliseconds);
    timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
    workerThread.Start(task);
//...

static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    if(workerThread != null && workerThread.IsAlive)
    {
        Console.WriteLine("thread has been running for {0}!", DateTime.Now - timeThreadStarted);
    }
}

これにより、1 秒後にスレッドの状態がチェックされます。まだ動作している場合は、少なくとも 1 秒間実行されています。

これには、どのスレッドもブロックしないという利点があります。UI があり、これを実行したい場合、UI スレッドをブロックすることはできません (応答しなくなり、ユーザー エクスペリエンスが低下します)。

于 2012-08-28T15:53:27.800 に答える
2

スレッドが 10 分後に何かを行う必要があることがわかっているので、次のように単純にタイマーで間隔を使用してみませんか。

var interval = 1000 * 60 * 10; // ten minutes
var timer = new System.Timers.Timer(interval) { AutoReset = false };
timer.Elapsed += ((sender, eventArgs) =>
    {
        // Do your work here...
    });

workerThread = new Thread(RunTask);
workerThread.Start(task);
timer.Start();

この方法では、毎秒チェックするのではなく、必要な時間の後にコードを実行します。

于 2012-08-28T15:55:33.397 に答える
1

. _ Thread.Join_ TimeSpan_ _ _Thread.Sleep

注: どちらのアプローチも、時間が経過するまでスレッドの呼び出しをブロックします。メイン/UI スレッドには適していません。

于 2012-08-28T15:59:55.083 に答える
0

経過時間がトリガーされるとイベントを発生させるタイマーを使用できます。

 private static void Main(string[] args)
    {
        var thread = new Thread(
            () =>
                {
                    var timer = new System.Timers.Timer
                        {
                            Interval = 10000, //10s
                            AutoReset = false, //only raise the elapsed event once
                        };
                    timer.Elapsed += timer_Elapsed;
                    timer.Start();
                    while (true)
                    {
                        Console.WriteLine("Running...");
                        Thread.Sleep(1000); //Always put a thread to sleep when its blocking so it does not waste CPU cycles.
                    }
                });
        thread.Start();
    }

    private static void timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        //thread is running for more that X (10s) amount of seconds
        Console.WriteLine("Timer elapsed");
    }

これは簡単な例です。この例では、スレッドは決して終了しません。ただし、達成しようとしているものを得るために、必要に応じて独自のロジックを追加できます。

簡単な答え: はい、System.Timers.Timer を使用します。

于 2012-08-28T15:55:18.237 に答える
-1

たとえば、タスク待機メソッドを使用できます。

var t = Task.Factory.StartNew(() => MyAction()); // MyAction is an action to be executed in parallel


bool check = t.Wait(10000); //wait for 10000 milliseconds
if (check)
{
 // all ok
}
else 
{
  // over time 
}

Wait メソッドは、タスクが終了するかタイムアウトが発生するまでブロックします。プライマリ スレッドをブロックしたくない場合は、並行して動作し、作業タスクをチェックする別のタスクを使用してサンプル コードを実行できます。

于 2012-08-28T15:57:44.667 に答える