gpt4 book ai didi

c# - 后台 worker 取消

转载 作者:太空宇宙 更新时间:2023-11-03 22:01:53 25 4
gpt4 key购买 nike

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

因为它在 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);
}

和我的 worker

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

StreamHolder = result;
});
}

最佳答案

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

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

其次,仅调用 CancelAsync() 不足以取消后台工作程序的当前操作。您必须将代码添加到后台工作人员的 DoWork 事件处理程序。 (在你的例子中是 WorkerDoWork)

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

您可以在此处阅读有关使用后台 worker 的正确方法的更多信息:

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

关于c# - 后台 worker 取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9808780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com