2012-03-21 110 views
1

我有一個計時器和一個後臺工作人員,它會在每個計時器滴答開始。有時我需要用戶停止這個工作流程,並通過點擊按鈕調用同一個bg工作人員。後臺工作人員取消

由於它在Silverlight中,它是全部異步的。 BG工作人員進行異步Web服務調用,它異步返回數據。 我已經這樣做了,但它只是感覺不對。處理這種情況的最佳方法是什麼?

button_click_event(..) 
{ 
_loadTimer.Stop(); 
       _worker.CancelAsync(); 
       _worker.RunWorkerAsync(); 
} 

Web服務調用

public void GetUserStats(DateTime start, DateTime end, Action<IEnumerable<IUserStats>, Exception> callback) 
    { 
     _context.GetUserStatsCompleted += ContextGetUserStatsCompleted; 
     _context.GetUserStatsAsync(start,end,callback); 
    } 

void ContextGetUserStatsCompleted(object sender, GetUserStatsCompletedEventArgs e) 
     { 
      var callback = e.UserState as Action<IEnumerable<IUserStats>, Exception>; 
      Exception error = null; 
      var result = new ObservableCollection<IUserStats>(); 
      if (e.Error == null) 
      { 
       result = e.Result; 
      } 
      else 
      { 
       error = e.Error; 
      } 
      _context.GetUserStatsCompleted -= ContextGetUserStatsCompleted; 
      callback(result, error); 
     } 

和我的工作人員都

void WorkerDoWork(object sender, DoWorkEventArgs e) 
     { 
      TicketService.GetUserStats(StartDate, EndDate, (result, error) => 
      { 

       StreamHolder = result; 
      }); 
     } 
+0

顯示您製作的Web服務調用的代碼。如果您已經異步調用Web服務,我不明白爲什麼您需要一個'BackgroundWorker'。 – 2012-03-21 16:29:32

+0

我同意羅伯特,但也會補充說,有asycn調用的結果檢查全局標誌關閉模型視圖(如果mvvm)這是由按鈕設置的點擊扔掉結果。 – OmegaMan 2012-03-21 16:39:31

+0

BackgroundWorker在那裏,因爲我需要每30秒調用一次WS。有沒有更好的方法來做到這一點?並且是它的mvvm – Inga 2012-03-25 02:07:38

回答

4

杉杉,您應經常檢查,看看你的工人正在運行,試圖再次運行它之前。如果你不這樣做,你的應用程序可能會拋出一個異常。

if(!_worker.IsBusy) 
{ 
    _worker.RunWorkerAsync(); 
} 

其次,只調用CancelAsync()是不足以取消當前的後臺工作的操作。您將不得不將代碼添加到後臺工作者的DoWork事件處理程序。 (在你的情況WorkerDoWork)

if(_worker.CancelationPending == true) 
{ 
    e.Cancel = true; 
    return; 
} 

您可以瞭解更多關於使用後臺工作在這裏的正確方法:

http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx

+0

謝謝!那很明確 – Inga 2012-03-21 16:44:19

+0

沒問題,如果是通過單擊downvote圖標下方的複選標記,請將問題標記爲已回答。 – evasilchenko 2012-03-21 17:25:34