2011-06-09 90 views
6

我在給定特定時間運行backgroundworker時遇到問題。如何在特定的時間啓動BackgroundWorker?

我的代碼只在一秒內運行backgoundworker。

我想增加我的背景中的間隔時間。

我使用這行代碼運行在一個按鈕單擊事件背景:

private void button1_Click(object sender, EventArgs e) 
{ 
    backgroundWorker1.RunWorkerAsync(); 
} 

然後在backgroundWorker1_DoWork

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    backgroundWorker1.CancelAsync(); 
} 

最後在backgroundWorker1_RunWorkCompleted

private void backgroundWorker1_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e) 
{ 
    backgroundWorker1.RunWorkerAsync(); 
} 

我想連續運行背景,但每隔5秒或超過5.

會有很大的升值,如果有人可以幫助我,

在此先感謝。

+0

使用計時器?我不確定我是否理解你的問題,你能詳細說明一下嗎? – jimplode 2011-06-09 11:57:42

+0

我知道要使用計時器,但我想使用背景。有什麼辦法在後臺使用時間間隔 – 2011-06-09 11:59:01

+2

爲什麼在DoWork()方法中使用CancelAsync? – 2011-06-09 11:59:17

回答

11

運行時

定時器類表示一個計時器控制,並用於創建在運行時間的計時器。下面的代碼片段在運行時創建一個Timer,設置它的屬性和事件處理程序。

Timer t = new Timer(); 
t.Interval = 2000;  
timer1.Enabled = true; 
timer1.Tick += new System.EventHandler(OnTimerEvent); 

事件處理程序代碼如下所示。

private void OnTimerEvent(object sender, EventArgs e) 
{ 
    backgroundWorker1.RunWorkerAsync(); 
} 

這裏是演示:C# Timer Tutorial

檢查文檔在MSDN:http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx

+1

你的答案是好的,但我無法投票,因爲我只有10聲望抱歉 – 2011-06-09 12:07:18

+0

我不認爲System.Timers.Timer有一個Tick事件。而是使用Elapsed。 – Dbloom 2015-07-15 23:23:37

1

你不能使用Timer開始你BackgroundWorker

+0

是的,但我可以,但它只要有超過20個背景工人在它 – 2011-06-09 12:00:53

5

您可以添加一個Timer設置時間間隔,您希望後臺工作人員運行的頻率以及計時器已用完的事件,您可以啓動後臺工作人員。

在嘗試重新啓動它之前,您需要檢查後臺工作器是否忙。如果出現這種情況,則可以考慮在完成後立即再次啓動後臺工作人員。 (如果你希望它至少每5秒運行一次)

如果你希望它在完成後等待5秒鐘,那麼你需要在啓動後臺工作器之前停止計時器,然後在後臺工作人員完成事件您需要重置計時器並重新啓動它。

編輯

您的意見一個低於你好像有很多backgroundworkers,之後在使用它開始BackgroundWorker的又是之前插入在完成事件背景工人延遲的其他方法的一個案例可能更好的解決方案。

您可以按照建議使用Thread.Sleep()插入延遲,或者您可以在函數中創建一個計時器,併爲啓動後臺工作的計時器已過時事件分配一個委託。沿着這些(未經測試)線的東西:

private void backgroundWorker1_RunWorkerCompleted(object sender,  RunWorkerCompletedEventArgs e) 
{ 
    Timer timer = new Timer(); 
    timer.Interval = 5000; 
    timer.Enabled = true; 
    timer.Elapsed+=delegate (object sender, ElapsedEventArgs args) 
     { 
     backgroundWorker1.RunWorkerAsync();   
     }; 
    timer.Start(); 
} 
2

最簡單的解決辦法是讓線程休眠5秒的backgroundWorker1_DoWork開頭:Thead.Sleep(5000)

或者,您可以在RunWorkerCompleted中設置一個計時器,並在5秒內過期,然後再次啓動BackgroundWorker。

+0

你的答案是好的,但我無法投票,因爲我只有10個信譽對不起 – 2011-06-09 12:07:06

2

您是否需要它正好每隔5秒運行不要超過5秒?如果是後者,您可以在BackgroundWorker完成DoWork()方法之前在Thread.CurrentThread上撥打Sleep(5000)

+0

你的答案是好的,但我無法投票,因爲我有隻有10個信譽對不起 – 2011-06-09 12:03:42

+0

@G巴沙 - 謝謝..我相信你可以在15點聲望投票,除非你已經使用了你所有的投票。 – Yuck 2011-06-09 12:05:41

2

如果你想使用BW試試這個:

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    Thread.Sleep(5000);//wait for 5s then run it again 
    backgroundWorker1.RunWorkerAsync(); 
} 
+0

你的回答是好的,但我無法投票,因爲我只有10個信譽對不起 – 2011-06-09 12:06:52

+0

@G巴沙 - 現在你可以投票+1問題.... – 2011-06-09 12:11:47

+0

其掛我的應用程序我應該什麼 – 2011-06-09 12:11:54