C# 背景工作者取消
我有一个计时器和一个后台工作程序,它会在每个计时器滴答声时启动。有时,我需要用户停止此工作流,并通过单击按钮调用同一个bg工作人员 因为它在Silverlight中,所以它是异步的。BG worker进行异步Webservice调用,该调用异步返回数据。 我这样做了,但感觉不对。处理这种情况的最佳方法是什么C# 背景工作者取消,c#,silverlight,C#,Silverlight,我有一个计时器和一个后台工作程序,它会在每个计时器滴答声时启动。有时,我需要用户停止此工作流,并通过单击按钮调用同一个bg工作人员 因为它在Silverlight中,所以它是异步的。BG worker进行异步Webservice调用,该调用异步返回数据。 我这样做了,但感觉不对。处理这种情况的最佳方法是什么 button_click_event(..) { _loadTimer.Stop(); _worker.CancelAsync();
button_click_event(..)
{
_loadTimer.Stop();
_worker.CancelAsync();
_worker.RunWorkerAsync();
}
网络服务呼叫
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);
}
首先,在再次尝试运行之前,您应该始终检查您的工作人员是否正在运行。如果不这样做,则应用程序可能会抛出异常
if(!_worker.IsBusy)
{
_worker.RunWorkerAsync();
}
其次,仅仅调用CancelAsync()不足以取消后台工作程序的当前操作。您必须向后台工作人员的DoWork事件处理程序添加代码。(就您的情况而言,WorkerDowWork)
您可以在此处阅读有关正确使用后台工作程序的更多信息:
首先,在再次尝试运行之前,您应该始终检查您的工作人员是否正在运行。如果不这样做,则应用程序可能会抛出异常
if(!_worker.IsBusy)
{
_worker.RunWorkerAsync();
}
其次,仅仅调用CancelAsync()不足以取消后台工作程序的当前操作。您必须向后台工作人员的DoWork事件处理程序添加代码。(就您的情况而言,WorkerDowWork)
您可以在此处阅读有关正确使用后台工作程序的更多信息:
显示进行Web服务调用的代码。如果您已经在异步调用web服务,我完全不明白为什么您需要一个
BackgroundWorker
。我同意Robert的观点,但还要补充一点,让asycn调用的结果在模型视图(如果是mvvm)上检查一个全局标志这是通过单击按钮来设置的,单击按钮可以丢弃结果。BackgroundWorker在那里,因为我需要每30秒调用一次WS。有更好的方法吗?是的,它是MVVMS,它显示了您进行Web服务调用的代码。如果您已经在异步调用web服务,我完全不明白为什么您需要一个BackgroundWorker
。我同意Robert的观点,但还要补充一点,让asycn调用的结果在模型视图(如果是mvvm)上检查一个全局标志这是通过单击按钮来设置的,单击按钮可以丢弃结果。BackgroundWorker在那里,因为我需要每30秒调用一次WS。有更好的方法吗?是,它的mvvmNo problem,如果是,请单击向下投票图标下方的复选标记将问题标记为已回答。没有问题,如果是,请单击向下投票图标下方的复选标记将问题标记为已回答。
if(_worker.CancelationPending == true)
{
e.Cancel = true;
return;
}