gpt4 book ai didi

c# - Backgroundworker ReportProgress事件不会触发

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

我有一个后台工作人员,负责我的应用程序中的计时器。这是代码:

    protected override void OnLoad(EventArgs e)
{
// Inizializzo il backgroundworker
bgwTimer.WorkerReportsProgress = true;
bgwTimer.WorkerSupportsCancellation = true;
bgwTimer.DoWork += (bgwTimer_DoWork);
bgwTimer.RunWorkerCompleted +=(bgwTimer_RunWorkerCompleted);
bgwTimer.ProgressChanged += (bgwTimer_ProgressChanged);
}

void bgwTimer_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
throw new NotImplementedException();
}

void bgwTimer_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
throw new NotImplementedException();
}

基本上,事件“ProgressChanged”从不触发,因此我无法更新进度栏的状态。
事件DoWork链接到此方法:
    void bgwTimer_DoWork(object sender, DoWorkEventArgs e)
{
int i = 0;
if (bgwTimer.CancellationPending)
{
e.Cancel = true;
}
else
{
while (bgwTimer.IsBusy)
{
Thread.Sleep(1000);
bgwTimer.ReportProgress(i);
refreshTimer();
}
}
}

在我这边,代码看起来不错,并且运行良好。如您所见,已调用ReportProgress方法,但未触发该事件。有什么提示吗?

更新:
哎呀!我发现只有在事件声明后立即运行RunWorkerAsync时,才会触发事件“bgwTimer_ProgressChanged”。基本上:

bgwTimer.ProgressChanged + =(bgwTimer_ProgressChanged);
bgwTimer.RunWorkerAsync();//这有效!

由于我在用户按下按钮时运行工作程序,因此不会触发该事件。

这是点击事件按钮的代码:
    private void btnNext_Click(object sender, EventArgs e)
{
this.TopMost = true;
btnNext.Enabled = false;
progressBar1.Step = 0;

if (_bgwTimer.IsBusy)
_bgwTimer.CancelAsync();
else
_bgwTimer.RunWorkerAsync();
}

最佳答案

Debug.Print之前放置一个断点,或者System.Windows.Forms.MessageboxbgwTimer.ReportProgress(i),以验证您是否确实进入了while循环。

请注意,BackgroundWorker实际上不是计时器。它是线程的包装器,为用户界面提供了线程安全的调用层。

您的if (bgwTimer.CancellationPending) { }应该在while循环内,而不是在循环外。它只会在您当前的代码中被检查一次。

请注意,如果您在DoWork事件处理程序中,那么根据定义,您正在运行一个异步进程,因此IsBusy应该始终为true(根据MSDN文档),因此while是无限循环。但是,请与您的调试器一起检查。

关于c# - Backgroundworker ReportProgress事件不会触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12917306/

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