gpt4 book ai didi

c# - 我可以从 BackgroundWorker 上的 RunWorkerCompleted() 中调用 RunWorkerAsync() 吗?

转载 作者:行者123 更新时间:2023-11-30 16:57:04 26 4
gpt4 key购买 nike

我已经设置了一个后台工作程序,我想在它完成后重新启动它。也就是说,在 DoWork() 完成后,如果结果不成功,我想从 RunWorkerCompleted() 处理程序中再次调用 RunWorkerAsync() 。当我在 RunWorkerCompleted() 中时,可以确保 IsBusy=false 吗?

例如:

void myThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if ((e.Error == null) && !e.Cancelled && (bool)e.Result)
// do stuff
else
myThread.RunWorkerAsync();
}

我似乎无法在任何地方找到对这种行为的确认。

最佳答案

不幸的是,文档没有明确说明这个问题。最重要的是,IsBusy 属性的代码示例实际上非常糟糕,因为它在属性上旋转等待并在循环中调用 Application.DoEvents() .

也就是说,正如其他人所建议的那样,最明智的设计是仅当异步工作程序实际运行时,标志才为 true。 IE。当 DoWork 事件处理程序返回时,它应该被设置回 false。事实上,如果看一下 the implementation ,人们看到了这个:

private void AsyncOperationCompleted(object arg)
{
isRunning = false;
cancellationPending = false;
OnRunWorkerCompleted((RunWorkerCompletedEventArgs)arg);
}

public bool IsBusy
{
get
{
return isRunning;
}
}

此处的 isRunning 标志是 IsBusy 属性返回的内容,也是 RunWorkerAsync() 检查是否应抛出异常的内容.从此处可以看出,在引发 RunWorkerCompleted 事件之前,实现将其设置回 false

所以,是的……从 RunWorkerCompleted 事件处理程序调用 RunWorkerAsync() 是绝对安全的。

如果没有对此进行记录,实现可能会发生变化的可能性微乎其微。但在这个阶段,如果发生这种情况,我会感到非常惊讶。尤其是在代码开源的情况下,实现与其他任何东西一样成为行为规范。

关于c# - 我可以从 BackgroundWorker 上的 RunWorkerCompleted() 中调用 RunWorkerAsync() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27048401/

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