簡體   English   中英

每隔x秒同時啟動多個功能?

[英]Start several functions at the same time in every x seconds?

我知道如何開始在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沒有完成,但我再次調用它們。 我是否在線程中啟動這些功能? 是否有一些調用x-threads運行function1()(同時)? 想知道真的很健康。

如果有人想獲得更多信息: function1只是將文件x從文件夾a復制到b,則function2只在那里讀取文件夾b中的所有文件並保存信息,而function3僅用於檢查連接,如果有是一個連接發送適當的文件給某人。

對代碼的任何建議? 謝謝

Parallel.Invoke並行運行所有函數。 由於function2不應該在function1之前運行,因此創建一個在后台運行它們但按順序運行的任務。

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

如果我的計時器設置為5秒,5秒后,功能1,2和3未完成,該怎么辦?

您可以使用bool來查看它們是否已完成。

使用System.Threading.TimerThreadPool線程上安排回調,因此您不需要創建新任務。 它還允許您控制間隔以防止回調重疊。

// 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);
}

你看過任務嗎?

你可以這樣做:

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來檢查任務是否已完成....然后決定是否發布下一批功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM