1

C# で 1 つのスレッドを作成しました。ここで、作成したスレッドを特定の時間に置きたいと思います。そして、スレッドを開始したいと思います。私の目標は、毎日午後 8 時に updateMark 関数を呼び出すことです。関数を呼び出した後、そのスレッドは次の 24 時間スリープ状態になります。そのため、翌日の午後 8 時に再び開始され、同じ作業が日常的に行われます。

**My C# code:-**
    public class ThreadProcess
    {
        public static void Main()
        {

        }

        public void updateMark()
        {
             string temp=ok("hai");
        }

        public string ok(string temp)
        {
             return temp+"!!!!";
        }
    }

したがって、別のクラスの次のコードでスレッドを使用しています。

        string targetTime = "08:05:00 PM";
        string currentTime = DateTime.Now.ToString("HH:mm:ss tt");

        DateTime t11 = Convert.ToDateTime(targetTime, culture);
        DateTime t21 = Convert.ToDateTime(currentTime, culture);

        ThreadProcess tp = new ThreadProcess();
        Thread myThread = new Thread(tp.updateMark);
        myThread.Start();

        if (t11.TimeOfDay.Ticks > t21.TimeOfDay.Ticks)
        {
            TimeSpan duration = DateTime.Parse(targetTime, culture).Subtract(DateTime.Parse(currentTime, culture));
            int ms = (int)duration.TotalMilliseconds;

            //Thread.Sleep(ms);i want to put my thread into sleep
        }

        while (true)
        {               
            myThread.start();

            Thread.Sleep(86400000);//put thread in sleep mode for next 24 hours...86400000 milleseconds...
        }      

この問題から抜け出すために私を導いてください...

4

2 に答える 2

2

このプロセスが内部に格納されているオブジェクトを作成する方が論理的ではないでしょうか。次に、毎晩、特定の時刻にそのオブジェクト内で run メソッドを呼び出します。ランダムなスリープ スレッドは必要なく、完了後にメモリは自動的にクリーンアップされます。

疑似コード

TargetTime := 8:00PM.
// Store the target time.
Start Timer.
// Start the timer, so it will tick every second or something. That's up to you.
function tick()
{
    CurrentTime := current time.
    // Grab the current time.
    if(CurrentTime == TargetTime)
    {
         // If CurrentTime and TargetTime match, we run the code.
         // Run respective method.
    }
}
于 2013-03-08T12:46:58.100 に答える
1

あなたの場合の代わりにタイマーを使うべきだと思いますThread.Sleep

.NET にはさまざまな種類のタイマーがあり、その一部についてはこちらを参照してください

に基づいて、次の単純化された実装をお勧めしますSystem.Threading.Timer

public class ScheduledJob
{
    //Period of time the timer will be raised. 
    //Not too often to prevent the system overload.
    private readonly TimeSpan _period = TimeSpan.FromMinutes(1);
    //08:05:00 PM
    private readonly TimeSpan _targetDayTime = new TimeSpan(20, 5, 0);
    private readonly Action _action;
    private readonly Timer _timer;

    private DateTime _prevTime;

    public ScheduledJob(Action action)
    {
        _action = action;
        _timer = new Timer(TimerRaised, null, 0, _period.Milliseconds);
    }

    private void TimerRaised(object state)
    {
        var currentTime = DateTime.Now;

        if (_prevTime.TimeOfDay < _targetDayTime
            && currentTime.TimeOfDay >= _targetDayTime)
        {
            _action();
        }

        _prevTime = currentTime;
    }
}

そして、クライアント コードで次のように呼び出します。

var job = new ScheduledJob(() =>
    {
        //Code to implement on timer raised. Run your thread here.
    });
于 2013-03-08T13:54:28.230 に答える