1

string contains value を頻繁に変更するメソッドを考えてみましょう。string から値を取得するために 1 分ごとに実行されるスレッドを作成する必要があります。

出来ますか?

特定のスレッド以外のプロセス全体をスリープさせる次のコードを試しました。

System.Threading.Thread.Sleep(10000);
4

5 に答える 5

5

定義された期間にスレッド化されたプロセスを実行したい場合、System.Threading.Timerクラスは完璧になります

var timer = new System.Threading.Timer((o) =>
{
    // do stuff every minute(60000ms)

}, null, 0, 60000);

ただし、このスレッドからUIコードを更新する場合は、UIスレッドで再度呼び出すことを忘れないでください。

WPF:

var timer = new System.Threading.Timer((o) =>
{
    Dispatcher.Invoke(DispatcherPriority.Normal, (Action)delegate
    {
        // do stuff WPF UI safe
    });

}, null, 0, 60000);

Winform

var timer = new System.Threading.Timer((o) =>
{
    base.Invoke((Action)delegate
    {
        // do stuff Winforms UI safe
    });

}, null, 0, 60000);

例:

private void StartUpdateTimer()
{
    var timer = new System.Threading.Timer((o) => 
    { 
        string ss = "gowtham " + DateTime.Now.ToString(); 
        Response.Write(ss); 
    }, null, 0,1000);
}
于 2013-01-09T06:14:50.257 に答える
1

使用する:

new Thread(delegate()
    {
         while(true)
         {
             // Do stuff
             Thread.sleep(60000);
         }
    }).Start();

60000ミリ秒は1分です

Thread.sleepは、現在のスレッドをスリープ状態にします

于 2013-01-09T06:12:30.890 に答える
1

Sleep新しいスレッドを開始せず、指定されたミリ秒数の間、現在のスレッド (この場合は UI スレッド) をブロックします。

説明に基づいて、新しいスレッドを開始し、そのスレッドでスリープできます。また、タイマーを使用する方が簡単かもしれません。完全なサンプルとスレッド オブジェクトに関する情報は、MSDN のスレッド記事で入手できます。

new Thread(ThreadFunction).Start(); 
于 2013-01-09T06:19:58.293 に答える
0

C# またはより具体的には、.NET は MULTITHREADING をサポートしています。

使用Thread.Sleep()すると、使用した1つのスレッドが無効になりますThread.Sleep()

「TPL」を使用して、60 秒ごとに文字列をサンプリングするスレッドを起動する例を次に示します。

System.Threading.Tasks.Task.Factory.StartNew(
()=>
{
System.Threading.Thread.Sleep(60000);
 ReadString()}
)

文字列を保護する必要があることに注意してください。RACE CONDITION

これには C#ロックを使用します

于 2013-01-09T06:20:37.547 に答える
0

60 秒ごとに新しいスレッドを開始する代わりに、終了後に次の実行までスリープする 1 つのスレッドを使用します。このようなもの:

Class Main{

public void startObserverThread(){
   Thread t = new Thread(this.observerThread);
   t.start();
}

private DateTime lastRun = null;
public void observerThread(){
   if (lastRun == null || DateTime.Now.Subtract(lastRun).Seconds >= 60){
       lastRun = DateTime.Now;
       //do thread work.
   }else{
       //check every second, if time elapsed
       Thread.sleep(1000);
   }
}

}

より正確にする必要がある場合は、待機時間を変更します。スレッドの最後に新しいスレッドを再スケジュールすることに対する大きな利点は、タスク自体の実行時間を気にする必要がないことです。10 秒かかる場合、スレッドは 50 秒程度スリープします。50 秒かかる場合、スレッドはタスク作業の完了後 10 秒しかスリープしません。

于 2013-01-09T06:22:52.817 に答える