Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 背景工作者取消_C#_Silverlight - Fatal编程技术网

C# 背景工作者取消

C# 背景工作者取消,c#,silverlight,C#,Silverlight,我有一个计时器和一个后台工作程序,它会在每个计时器滴答声时启动。有时,我需要用户停止此工作流,并通过单击按钮调用同一个bg工作人员 因为它在Silverlight中,所以它是异步的。BG worker进行异步Webservice调用,该调用异步返回数据。 我这样做了,但感觉不对。处理这种情况的最佳方法是什么 button_click_event(..) { _loadTimer.Stop(); _worker.CancelAsync();

我有一个计时器和一个后台工作程序,它会在每个计时器滴答声时启动。有时,我需要用户停止此工作流,并通过单击按钮调用同一个bg工作人员

因为它在Silverlight中,所以它是异步的。BG worker进行异步Webservice调用,该调用异步返回数据。 我这样做了,但感觉不对。处理这种情况的最佳方法是什么

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;
}