【问题标题】:BackgroundWorker track method from another class来自另一个类的 BackgroundWorker 跟踪方法
【发布时间】:2011-08-17 03:09:06
【问题描述】:

[编辑]

我用完整的代码和解释编辑了我的问题,希望能给我更清楚的解释。

我有以下类,它有一个后台工作程序来跟踪循环的百分比进度并更新 ProgressWin XAML 上标签上的百分比进度。以下代码完美运行。 (我的问题远在下面,在代码之后。)

public partial class ProgressWin : Window
{
    BackgroundWorker backgroundWorker1 = new BackgroundWorker();

    public ProgressWin()
    {
        InitializeComponent();
        InitializeBackgroundWorker();
        startAsync();
    }

    // Set up the BackgroundWorker object by 
    // attaching event handlers. 
    private void InitializeBackgroundWorker()
    {
        backgroundWorker1.WorkerReportsProgress = true;
        backgroundWorker1.WorkerSupportsCancellation = true;
        backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
        backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
        backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
    }

    private void startAsync()
    {
        backgroundWorker1.RunWorkerAsync();
    }

    public void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;

        for (int i = 1; i <= 10; i++)
        {
            System.Threading.Thread.Sleep(500);
            worker.ReportProgress(i * 10);
        }
    }

    // This event handler updates the progress.
    public void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        label1.Content = (e.ProgressPercentage.ToString() + "%");
    }

    // This event handler deals with the results of the background operation.
    public void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
         resultLabel.Content = "Done!";
    }
}

我的问题来了,现在我需要在我的 MainWindow 中跟踪循环,而不是跟踪 ProgressWin 中的循环:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        for (int i = 1; i <= 10; i++)
        {
            System.Threading.Thread.Sleep(500);
            ????.ReportProgress(i * 10);
        }
    }
}

我不知道从这里去哪里。我尝试从 ProgressWin 实例化一个对象并调用 DoWork,但我最终冻结了 ProgressWin 窗口。

【问题讨论】:

    标签: c# wpf backgroundworker


    【解决方案1】:

    由于问题被改写,我也改写了整个答案。

    要让它工作,你的 MainWindow有一个 ProgressWindow 并且应该像后台工作人员一样使用它:

    public partial class MainWindow : Window
    {
        private ProgressWindow _Progress;
    
        public MainWindow()
        {
            InitializeComponent();
    
            _Progress = new ProgressWindow();
            _Progress.ProgressChanged += OnProgressChanged;
    
        }
    
        private void OnProgressChanged(object sender, ProjectChangedEventArgs e)
        {
            //ToDo: Update whatever you like in your MainWindow
        }
    }
    

    要做到这一点,您的 ProgressWindow 应该简单地订阅工作者事件并重新抛出它:

    public partial class ProgressWin : Window
    {
        // Add this to your class above in your question
        public event ProgressChangedEventHandler ProgressChanged;
    
        // Change or merge this with your existing function
        private void backgroundWorker1_ProgressChanged(object sender, ProjectChangedEventArgs e)
        {
            var temp = ProgressChanged;
            if(temp !=null)
                temp(this, e);
        }
    }
    

    【讨论】:

    • 是 MainWindow 类中的 DoSomething 和另一个类中的 myWorker 吗? “数据”从何而来?为什么我将数据转换为 BackgroundWorder?抱歉,我对您的回答理解为零,请您详细说明一下,非常感谢。
    • 我已经编辑了我的问题,我想这会让我更容易理解我的问题..
    【解决方案2】:

    你可以简单地调用另一个类的方法

    backgroudnWorker.DoWork += new DoWorkEventHandler(SomeClass.SomeStaticMethod);

    backgroudnWorker.DoWork += new DoWorkEventHandler(SomeClassInstance.SomeMethod);

    要从另一个类ProgressScreen 调用MainWindow 类的方法,您应该在ProgressScreen 中引用MainWindow 类的实例,然后使用该实例,您可以从@987654328 调用MainWindow 的任何公共方法@类

    正如 Oliver 所说,您将需要 backgroundworker 的实例来从其他方法发送进度更新。

    【讨论】:

    • 我在哪里设置 backgroundworker 的实例,在我的 MainWindow 或我的其他类中?如何发送进度更新。
    • 您想在ProgressScreen 课程中取得进步,对吗?在该类中创建 BackgroudWorker 的实例。现在将BGWorker 的实例作为参数传递给您将在DoWork 中调用的方法,即TimeConsumingMethod
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 2012-07-09
    • 2012-06-19
    • 2013-08-12
    相关资源
    最近更新 更多