后台工作人员取消

本文关键字:取消 工作人员 后台 | 更新日期: 2023-09-27 18:28:37

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

由于它在Silverlight中,所以都是异步的。BG工作人员进行异步Web服务调用,该调用异步返回数据。我这样做了,但感觉不对。处理这种情况的最佳方法是什么?

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

WebService调用

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

后台工作人员取消

首先,在尝试再次运行它之前,您应该始终检查您的工作程序是否正在运行。如果您不这样做,那么您的应用程序可能会抛出异常。

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