2013-08-01 36 views
2

我有這樣的BackgroundWorker:Silverlight在一段時間(真)會危險嗎?

MyBackgroundWorker.DoWork += ((sender, arg) => 
     { 
      while (true) 
      { 
       client.GetkFailuresCompleted += ((s, e) => 
       { 
        int[] arr = JsonHelper.Deserialize<int[]>(e.Result); 

        int error = (int)((arr[0]/(double)arr[1]) * 100); 

        Debug.WriteLine("Error %: " + error); 

        this.Dispatcher.BeginInvoke(() => 
         { 
          ErrorOverviewPointCollection.Clear(); 
          ErrorOverviewPointCollection.Add(new Point(1, 100 - error)); 
          ErrorOverviewPointCollection.Add(new Point(1, error)); 
         }); 
       }); 
       client.GetFailuresAsync(); 

       Thread.Sleep(5000); 
      } 
     }); 

正如你看到的進出口運行它永遠。我沒有執行任何停止/失敗功能來停止BackgroundWorker,但是我需要嗎?如果用戶關閉瀏覽器,應用程序應該停止運行?

DoWork訪問web服務,完成後更新一個ObservableCollection,這是一個數據綁定到silverlight應用程序。

+0

我會假設關閉標籤頁/瀏覽器會殺死其中運行的任何東西。 (在Chrome中,每個選項卡都是一個單獨的進程)。 –

+4

是否有任何理由,而不是使用計時器? –

+0

您每次註冊事件都會造成內存泄漏! [@ErenErsönmez解決方案](http://stackoverflow.com/a/17987379/1425718)似乎是最合適的。 – Tonio

回答

0

如果您不是作爲瀏覽器外應用程序執行,那麼這並不危險。請記住,所有非OOB silverlight應用程序都是在插件中執行的,關閉瀏覽器應用程序後,插件關閉,並終止其中運行的所有代碼。

這就是說,我是而不是說這是在OOB環境中執行的危險代碼。但爲了安全起見,您應該在關閉OOB silverlight窗口後測試它是否保持活動狀態。

然而,最好的做法是更換

while(true) 

while(bApplicationIsAlive) 

,並設置bApplicationIsAlive爲false應用程序的退出的事件處理程序。

0

如果你沒有任何一次性資源,它會沒事的。如果你這樣做,那麼你應該實施某種停止機制來優雅地停止後臺工作。

此外,與異步模式,你真的不需要該背景的工人。這是可行的:

client.GetFailuresCompleted += (s, a) => 
{ 
    // do work... 

    Thread.Sleep(5000); 
    client.GetFailuresAsync(); 
}; 
client.GetFailuresAsync(); 

這將避免保持一個循環來調用異步方法。此外,它具有延遲等待時間直到之後處理響應的優點,因此呼叫不重疊(如果呼叫和處理響應花費的時間超過5秒)。

而Jon Skeet評論說,你可以使用計時器來實現同樣的目標。