【问题标题】:C# updating backgroundworker progress from separate classC# 从单独的类更新后台工作者进度
【发布时间】:2013-03-29 16:20:50
【问题描述】:

我正在尝试通过后台工作程序在与调度程序不同的类中运行一个函数,并让它在每次迭代时更新进度。我没有收到任何错误,并且后台工作程序运行正常,但我的文本框永远不会更新...

public partial class MainWindow : Window
{
    public BackgroundWorker worker = new BackgroundWorker();

    public MainWindow()
    {
        InitializeComponent();
        worker.WorkerReportsProgress = true;
        worker.DoWork += new DoWorkEventHandler(workerDoWork);
        worker.ProgressChanged += new ProgressChangedEventHandler(workerProgressChanged);
    }

    private void myButtonClick(object sender, RoutedEventArgs e)
    {
        worker.RunWorkerAsync();
    }

    void workerDoWork(object sender, DoWorkEventArgs e)
    {
        yv_usfm.convert(worker);
    }

    void workerProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        myTextBox.Text = "some text";
    }

}

public class yv_usfm
{
    public static void convert(BackgroundWorker worker)
    {
        int i = 1;
        while (i < 100)
        {
            worker.ReportProgress(i);
            i++;
        }
    }
}

【问题讨论】:

  • 如果您正在考虑从 不同的 类更新 BackgroundWorker 的进度,那么您误解了 BackgroundWorker 的用途。我建议你使用Task&lt;T&gt; 或线程池。
  • 我刚刚复制并运行了你的代码,它对我来说很好......
  • 是的,我不知道为什么我的文本框没有更新
  • Err 抱歉,我刚刚意识到您正在使用 WPF。它在 Windows 窗体中工作正常,但不是 WPF 窗口
  • 再次抱歉。它在 WPF 中也为我工作......该死!

标签: c# wpf backgroundworker


【解决方案1】:

是什么让您说BackgroundWorker 运行正常?我看不到对 worker.RunWorkerAsync() 的调用,没有它就永远不会启动。

【讨论】:

  • 我的错,我的代码中有它,我只是没有放入堆栈溢出 --__-
【解决方案2】:

你没有启动工人!

worker.RunWorkerAsync();

【讨论】:

  • 我的代码中确实有它,我只是愚蠢地忘记将它包含在我的 stackoverflow 帖子中...已编辑
  • 我制作了自己的快速项目,复制并粘贴了您的代码,一旦我添加了RunWorkerAsync(),文本框就更新得很好。您在此处的示例代码与您正在处理的项目之间是否还有其他差异?
  • 在我的项目代码中,我实际上在按钮点击中有worker.RunWorkerAsync();,我更新了我的帖子
  • 我刚刚将RunWorkerAsync() 移动到按钮单击事件中,当我单击按钮时,文本框仍会更新。您是否尝试将问题中的代码复制到新的普通 WPF 项目中以隔离问题?
【解决方案3】:

试试这个:

void DoWork(...)
{
    YourMethod();
}

void YourMethod()
{
    if(yourControl.InvokeRequired)
        yourControl.Invoke((Action)(() => YourMethod()));
    else
    {
        //Access controls
    }
}

希望对您有所帮助。

【讨论】:

  • BackgroundWorker.ProgressChanged 在 UI 线程上被调用。您不需要这样做。
  • @George 我只是想帮助那个人,我认为我的回答可以帮助那个人。
  • @George 请阅读下面 Charles Mager 的回答并由该人发表评论。
  • 我不明白;在问题的示例中,不需要调用,因为在 UI 线程上触发了 BackgroundWorker.ProgressChanged 事件。 Charles Mager 的回答与我的回答相同,并且无关紧要,因为该问题已被编辑/更新。这个答案会使情况不必要地复杂化,不是吗?如果我误解了,请道歉。
  • 没关系@George 实际上我很惊讶你对我的回答投了反对票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
  • 2015-02-18
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多