backgroundWorker_ProgressChanged 不起作用?

发布于 2024-12-29 15:32:38 字数 800 浏览 2 评论 0原文

我在使用后台工作程序时遇到问题

private void backgroundPBar_ProgressChanged(object sender, ProgressChangedEventArgs e)

该函数在 backgroundPBar.ReportProgress(value); 时不执行,

这是代码:

private void backgroundPBar_DoWork(object sender, DoWorkEventArgs e) {
    while (fileTransfer.busy) {
        if (fileTransfer.sum > 0) {
            int value = Convert.ToInt32((fileTransfer.sum * 100) / fileTransfer.fileSize);
            backgroundPBar.ReportProgress(value);
            Console.WriteLine(value);
        }
    }
}

private void backgroundPBar_ProgressChanged(object sender, ProgressChangedEventArgs e) {
    progressBarFile.Value = e.ProgressPercentage;
    this.Text = e.ProgressPercentage.ToString() + "%";
}

如何修复它?

I am having a trouble with background worker

private void backgroundPBar_ProgressChanged(object sender, ProgressChangedEventArgs e)

The function doesn't execute when backgroundPBar.ReportProgress(value);

here's the code:

private void backgroundPBar_DoWork(object sender, DoWorkEventArgs e) {
    while (fileTransfer.busy) {
        if (fileTransfer.sum > 0) {
            int value = Convert.ToInt32((fileTransfer.sum * 100) / fileTransfer.fileSize);
            backgroundPBar.ReportProgress(value);
            Console.WriteLine(value);
        }
    }
}

private void backgroundPBar_ProgressChanged(object sender, ProgressChangedEventArgs e) {
    progressBarFile.Value = e.ProgressPercentage;
    this.Text = e.ProgressPercentage.ToString() + "%";
}

How can I fix it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

旧城空念 2025-01-05 15:32:38

确保您已连接进度事件:

backgroundPBar.ProgressChanged += backgroundPBar_ProgressChanged

从您的描述来看,似乎没有。这里的假设是 fileTransfer.busy 为 true 并且 fileTransfer.sum > 为 true。 0 也是如此。

另外,请确保您拥有后台工作人员集的属性:(

backgroundPBar.WorkerReportsProgress = true;

正如我看到提到的“面具”)。

Make sure you have the progress event wired up:

backgroundPBar.ProgressChanged += backgroundPBar_ProgressChanged

From you description, it seems like it isn't. The assumption here is that fileTransfer.busy is true and fileTransfer.sum > 0 is also true.

Also, make sure you have your the properties of the background worker set:

backgroundPBar.WorkerReportsProgress = true;

(as I see "The Mask" mentioned").

烟若柳尘 2025-01-05 15:32:38

不要忘记要使用 ReportProgress() 方法,您必须设置 WorkerReportsProgresstrue

don't forget that to use ReportProgress() method you must set WorkerReportsProgress as true.

記憶穿過時間隧道 2025-01-05 15:32:38

当调用 ReportProgress 方法时,我无法立即触发 ProgressChanged 事件。因为它们是单独的线程,所以我不得不诉诸线程同步。我使用了几个 WaitHandles 和 SignalAndWait 方法来同步两个线程。我有点违背了后台工作人员的目的,但如果我真的希望 UI 线程按时做某事,它确实必须让后台工作人员等待,直到 UI 线程收到消息并执行工作。

    Private ReportProgressWaitEvent As New AutoResetEvent(False)
    Private ReportProgressReadyWaitEvent As New ManualResetEvent(False)
    Private Sub ReportProgress(backgroundWorkerProgressEvents As BackgroundWorkerProgressEventsEnum, userState As Object)
        ReportProgressReadyWaitEvent.Reset()
        _backgroundWorker.ReportProgress(backgroundWorkerProgressEvents, userState)
        WaitHandle.SignalAndWait(ReportProgressReadyWaitEvent, ReportProgressWaitEvent)
    End Sub
    Private Sub _backgroundWorker_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles _backgroundWorker.ProgressChanged
        ... do work ...
        ReportProgressReadyWaitEvent.WaitOne()
        ReportProgressWaitEvent.Set()
    End Sub

I've been having problems getting the ProgressChanged event to fire immediately when the ReportProgress method is called. Because they are seperate threads, I had to resort to thread synchronization. I used a couple WaitHandles and the SignalAndWait method to synchronize the two threads. I kinda defeats the purpose of the background worker, but if I really want the UI thread to do something on time, it really has to make the background worker wait until the UI thread got the message and performed the work.

    Private ReportProgressWaitEvent As New AutoResetEvent(False)
    Private ReportProgressReadyWaitEvent As New ManualResetEvent(False)
    Private Sub ReportProgress(backgroundWorkerProgressEvents As BackgroundWorkerProgressEventsEnum, userState As Object)
        ReportProgressReadyWaitEvent.Reset()
        _backgroundWorker.ReportProgress(backgroundWorkerProgressEvents, userState)
        WaitHandle.SignalAndWait(ReportProgressReadyWaitEvent, ReportProgressWaitEvent)
    End Sub
    Private Sub _backgroundWorker_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles _backgroundWorker.ProgressChanged
        ... do work ...
        ReportProgressReadyWaitEvent.WaitOne()
        ReportProgressWaitEvent.Set()
    End Sub
吾性傲以野 2025-01-05 15:32:38

这是有关如何将后台工作程序与 ProgressBar 一起使用的教程,

您应该调用 (RunWorkerAsync)首先,backgroundPBar_DoWork 将开始执行其代码。

backgroundPBar.RunWorkerAsync();

Here's a tutorial of how to use backgroundworker with ProgressBar

You should call (RunWorkerAsync) first then the backgroundPBar_DoWork will start executing its code.

backgroundPBar.RunWorkerAsync();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文