[英]Running a BackgroundWorker within another BackgroundWorker
[英]BackgroundWorker used within collection items
我使用Backgroudworker做一些工作,以完成一些耗時的任務。
public void ConnectDataProvider()
{
bgw = new BackgroundWorker();
bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
}
另一種方法啟動后台工作程序:
public void StartPolling()
{
bgw.RunWorkerAsync();
}
然后,我進行了事件處理:
void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// do it over again
StartPolling();
}
void bgw_DoWork(object sender, DoWorkEventArgs e)
{
// do work
WriteData();
}
如您所見,我在完成時重新啟動了工作程序。 現在,這適用於單個背景工作人員。
現在我想要一個集合,並且每個項目都應該執行此任務。 但是,使用上述概念,它將在第一個工作進程啟動時繼續運行。 我在想,也許結合使用Timer可以解決這種情況,從而為其他工作線程提供方式。
BackgroundWorker還是一個不錯的選擇嗎? 像我一樣重復使用BackgroundWorker是否很常見?
編輯1:澄清:我面臨的問題是,我需要使用自己的BackgroundWorker管理集合。 我在考慮一個計時器,以定期從每個項目中發出請求。 這就是我卡住的地方。
編輯2:看到我自己的答案,我沒有解決此問題,但發現我可以與計時器一起得到想要的東西。
編輯3:為了澄清(另一種嘗試,我不太擅長)我想要實現的目標:我已經跟蹤了對象,用於gps跟蹤。 我想跟蹤一大堆,所以每個跟蹤設備一個對象。 它們都需要經常進行輪詢。 我為單個測試對象設置了BackgroundWorker。 我喜歡背景工作人員告訴我完成的方式。 但是我無法讓它與所有跟蹤對象一起使用。
現在,每個跟蹤對象都有自己的計時器。 此計時器產生一個新線程並完成耗時的工作(我將其命名為DoWrite)。 不需要BackgroundWorker,因為我配置了計時器,然后創建了一個新計時器。 這就是全部。
其中可能有多少? 您應該小心在集合中的項目與線程之間創建1:1關系。 可能會出現另一個編碼器,並且比您計划的更多地擴展此集合。
對於這樣的事情,我通常只想使用一個線程和一個隊列-因此事件只是將需要完成的工作放在ConcurrentQueue中,並且線程在未運行時就開始運行,並在排隊的工作中攪動直到它沒事做就死了 下次需要進行更多工作時,該事件將檢查線程是否正在運行並啟動它。
之所以便宜,是因為如果有很多正在進行的操作,您只運行一個線程而不是停止並啟動很多線程,或者如果運行很少,則一個線程幾乎永遠不會運行。
如果僅在Dowork()中放置while()循環(也許只需要一點Sleep()),則解決方案就會看起來更合乎邏輯。
這樣就不會反對運行多個Bgw,盡管您可能不會看到很大的速度優勢。
您可以完全按照自己的描述進行操作,只需確保將對相關后台工作程序的引用傳遞給StartPolling
,從而:
void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// do it over again
StartPolling((BackgroundWorker)sender);
}
public void StartPolling(BackgroundWorker worker)
{
worker.RunWorkerAsync();
}
那么顯然,您需要相應地管理BackgroundWorker
的集合。
您為什么不使用progresschanged事件? 您可以使用userstate對象傳遞數據。
在實際工作中,僅池化設備,而在更改過程中,將數據發送到UI線程。
無休止地執行此操作,然后使用cancel停止該線程。
問候。
當您要同時執行多個耗時的任務時,建議您使用線程池
由於到目前為止還沒有人做,所以我將使用計時器方法。 我試圖將兩者(BackgroundWorker和Timer)結合起來,但這沒有任何意義。
我想要一種允許多個實例通過線程請求數據的機制。 另外,我希望兩者之間有一定間隔。
因此,在嘗試之后,我認為我只能接受定時器方法:
public void ConnectDataProvider()
{
timer = new Timer(new TimerCallback(tCallback), null, 0, Timeout.Infinite);
}
private void tCallback(object state)
{
timer.Dispose();
// time consuming task
WriteData();
timer = new Timer(new TimerCallback(tCallback), null, 5000, Timeout.Infinite);
}
這就是約翰·桑德斯(John Saunders)關於類似(但不同)的問題的建議。 似乎可以完成工作。 WriteData()
具有同步的HttpWebRequest,因此它可以處理超時。
我現在的問題是: 計時器對象的新實例的價格是多少? 我指的是多么昂貴:是否有更好的方法來實現這一目標?
注意:WebRequest的異步方法不起作用,我嘗試過。 到目前為止,我還沒有任何線索,如果這是服務器的一種方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.