我有一個計時器和一個後臺工作人員,它會在每個計時器滴答開始。有時我需要用戶停止這個工作流程,並通過點擊按鈕調用同一個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;
});
}
顯示您製作的Web服務調用的代碼。如果您已經異步調用Web服務,我不明白爲什麼您需要一個'BackgroundWorker'。 – 2012-03-21 16:29:32
我同意羅伯特,但也會補充說,有asycn調用的結果檢查全局標誌關閉模型視圖(如果mvvm)這是由按鈕設置的點擊扔掉結果。 – OmegaMan 2012-03-21 16:39:31
BackgroundWorker在那裏,因爲我需要每30秒調用一次WS。有沒有更好的方法來做到這一點?並且是它的mvvm – Inga 2012-03-25 02:07:38