1

関数を x 秒で開始する方法を知っています。次のようなものです

private Timer timer1; 
public void InitTimer()
{
    timer1 = new Timer();
    timer1.Tick += new EventHandler(timer1_Tick);
    timer1.Interval = 2000; // in miliseconds
    timer1.Start();
}

private void timer1_Tick(object sender, EventArgs e)
{
    function1();
    function2();
    function3();
}

ここでの問題: 関数は同時に実行できません。Function2されている場合にのみ実行できFunction1ます。しかし、私はそれらを同時に実行したいと考えています。それが私がこれを行うことができる理由です:

private void timer1_Tick(object sender, EventArgs e)
{
   Parallel.Invoke(
     () => Function1(),
     () => Function2(),
     () => Function3()
   );
}

これは c# で行う最もスマートな方法ですか? 理解できないことParallel.Invoke:タイマーが5秒に設定されていて、5秒後に機能1、2、3が完了していない場合、それらをすべて再度呼び出します。これらの関数を新しいスレッドで開始しますか? function1() を (同時に) 実行しているいくつかの呼び出しの後に x-threads がありますか? 本当に健康なのだろうか。

誰かがより多くの情報を取得したい場合:function1ファイル x をフォルダー a から b にコピーするfunction2だけで、フォルダー b からすべてのファイルを読み取って情報を保存しfunction3、接続を確認し、接続があるかどうかを確認するだけです。適切なファイルを誰かに送信します。

コードへの提案はありますか?ありがとうございました

4

3 に答える 3

2

Parallel.Invoke は、すべての関数を並行して実行します。function2 は function1 の前に実行されるべきではないため、それらをバックグラウンドで順次実行するタスクを作成します。

Task.Factory.StartNew(() =>
{
    function1();
    function2();
    function3();
});

タイマーが 5 秒に設定されていて、5 秒後に機能 1、2、3 が完了していない場合

を使用して、boolそれらが完了しているかどうかを確認できます。

于 2012-08-17T16:04:04.143 に答える
1

System.Threading.Timerスレッドでコールバックをスケジュールするために使用ThreadPoolするため、新しいタスクを作成する必要はありません。また、コールバックのオーバーラップを防ぐために間隔を制御することもできます。

// fired after 5 secs, but just once.
_timer = new System.Threading.Timer(Callback, null, 5000, Timeout.Infinite);

// on the callback you must re-schedule the next callback time;
private void Callback(Object state) {
   Function1();
   Function2();

   // schedule the next callback time 
   _timer.Change(5000, Timeout.Infinite);
}
于 2012-08-19T09:57:30.333 に答える
0

タスクを見ましたか?

次のようなことができます。

Task[] tasks = new Task[3];
tasks[0] = Task.Factory.StartNew(() => Function1());
tasks[1] = Task.Factory.StartNew(() => Function2());
tasks[2] = Task.Factory.StartNew(() => Function3());
Task.WaitAll(tasks);

上記により、関数を並行して実行できるようになります。これは、必要なことを暗示しています。

すべてのタスクが完了するのを待っている間にブロックしたくない場合はtimer1_Tick、WaitAll を使用しないでください。代わりに、タイマーが再起動したときにタスクの IsCompleted をチェックして、タスクが完了したかどうかを確認できます。 ...次に、関数の次のバッチを発行するかどうかを決定します。

于 2012-08-17T16:02:43.317 に答える