簡體   English   中英

收集項目中使用的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停止該線程。

問候。

當您要同時執行多個耗時的任務時,建議您使用線程池

http://msdn.microsoft.com/en-us/library/ms973903.aspx

由於到目前為止還沒有人做,所以我將使用計時器方法。 我試圖將兩者(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.

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