2016-05-03 20 views
0

私のウィンドウサービスアプリケーションでThread.sleep()を置き換えたいです。しかし、私は自分のコードでそれを使用する方法を取得していない。私のサービスでは、毎回10分後にforeachループでマシンのリストを繰り返す必要があり、そのループで私はいくつかの時間の遅延の後に新しいスレッドを開始しました。 2秒の遅延。だから私はすべてのスレッドの作成後にthread.sleep()を使用しています。 Thread.sleep()を置き換えるにはどうすればいいですか?タイマーでasynchタスクを使用する必要がありますが、asynchタスクで変換する方法がわかりません。タイマー内部の非同期タスク

protected override void OnStart(string[] args) 
{ 
    timer1 = new System.Timers.Timer(); 
    this.timer1.Interval = 10000; 
    this.timer1.Elapsed += new System.Timers.ElapsedEventHandler(this.timer1_Tick); 
    timer1.Enabled = true; 
} 

private void timer2_Tick(object sender, EventArgs e) 
{ 
    foreach(var list in machinelist) 
    { 
     createComAndMessagePumpThread2 = new Thread(() => 
       { 
        // connection with machines code using list 
        Application.Run(); 
       }); 
     createComAndMessagePumpThread2.SetApartmentState(ApartmentState.STA); 

     createComAndMessagePumpThread2.Start(); 
     Thread.Sleep(2000); 
    } 
} 
+3

あなたのコードは本当にひどくフォーマットされています。 –

+0

Task.Delayを使用してみてくださいhttps://msdn.microsoft.com/en-us/library/system.threading.tasks.task.delay(v=vs.110).aspx – Mangist

答えて

-2

遅延は本当に必要ですか?OSはアプリケーションの起動時におそらくあなたのためのリソースを管理するでしょうか?なぜこのようなことをしないのですか?

protected override void OnStart(string[] args) 
{  
    Parallel.ForEach(
     machinelist, (list) => 
     { 
      var Application = //however you do this... 
      Application.Run(); 
     } 
    ); 
} 

...必要に応じてdifferent TaskSchedulerを使用してください。

+0

これは2秒の遅延を追加しません各ループ反復の間。 – Mangist

+0

@Mangist - あなたが正しいです。私は混乱しているコメントを削除しました。私が得ようとしていたことは、遅延が本当に必要かどうかの質問をする価値があるということです。 – Colin

0

あなたが望むすべてがこの作業を行います、同等の非同期メソッドにThread.Sleep()を変換する場合:

protected override void OnStart(string[] args) 
{ 
    Task.Run(async()=> { while(true) await LunchTasks(); }); 
} 

private Task LunchTasks() 
{ 
    var tasks = machinelist.Select(machinelist=> 
    foreach(var machinelist in machinelist) 
    { 
     createComAndMessagePumpThread2 = new Thread(() => 
     { 
      // connection with machines code using list 
      Application.Run(); 
     }); 
     createComAndMessagePumpThread2.SetApartmentState(ApartmentState.STA); 

     createComAndMessagePumpThread2.Start(); 
     return Task.Delay(2000); 
    } 
} 

しかし、あなたはかろうじてそれから利益を得るであろう。各アプリケーションごとに定期的に新しいスレッドを回転させるのは、あなたがブロックするスレッドよりもはるかに高価です(Thread.Sleep())。非同期プログラミングの機能を最大限に活用するには、アプリケーションを物理スレッドから切り離す方法を理解する必要があります。あなたはThreadではなく、Taskという概念に慣れる必要があります。うまくいけばあなたのプログラムはそれを行うことができます。

関連する問題