【问题标题】:how do I pass info to my main class from a child class如何将信息从子类传递给我的主类
【发布时间】:2013-08-06 07:47:58
【问题描述】:

我有两个类,来自 WPF 的主类和在“PersistDataToTable.Persist”内称为“PersistDataToTable”的子类我有一个循环,我想将该循环增量传递回主 WPF 类以显示在进度条中. 我有一个后台工作线程运行命中循环的方法,我只是不知道如何将数据从后台工作线程返回给 ReportProgress 方法。

private void PersistDataToDb(object sender, RoutedEventArgs e)
    {
        worker = new BackgroundWorker();
        worker.WorkerReportsProgress = true;

        worker.DoWork += delegate(object o, DoWorkEventArgs args)
            {
                PersistDataToTable persistData = new PersistDataToTable();
                persistData.Persist(seriesId);

                worker.ReportProgress(loop incrament from persist()??);

            };

        worker.ProgressChanged += delegate(object o, ProgressChangedEventArgs args)
            { 
                int percentage = args.ProgressPercentage;
                progressBar.Value = percentage;
            };

        worker.RunWorkerAsync();
    }

【问题讨论】:

    标签: c# wpf delegates


    【解决方案1】:

    您可以将 worker.ReportProgress 作为 Action<Int> 传递到您的 Persist 方法中,以便它更新回您的 UI

    例子:

    private void PersistDataToDb(object sender, RoutedEventArgs e)
    {
        worker = new BackgroundWorker();
        worker.WorkerReportsProgress = true;
    
        worker.DoWork += delegate(object o, DoWorkEventArgs args)
            {
                PersistDataToTable persistData = new PersistDataToTable();
                persistData.Persist(seriesId, worker.ReportProgress);
            };
    
        worker.ProgressChanged += delegate(object o, ProgressChangedEventArgs args)
            {
                int percentage = args.ProgressPercentage;
                progressBar.Value = percentage;
            };
    
        worker.RunWorkerAsync();
    }
    
    public class PersistDataToTable
    {
        public void Persist(int seriesId, Action<int> progresscallback)
        {
    
            // set the progress and call the Action(worker.ReportProgress)
            for (int i = 0; i < 100; i++)
            {
                progresscallback.Invoke(i);
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      使用事件 DoWork 和 RunWorkerComplete。这是一个计数到 10 并将结果传递给标签的示例:

      void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
      {
          label1.Text = e.Result.ToString(); // getting the result set in DoWork
      }
      
      void worker_DoWork(object sender, DoWorkEventArgs e)
      {
          int value = 0;
      
          for (int i = 0; i < 10; i++)
              value++;
      
          e.Result = value; // setting result for RunWorkerCompleted
      }
      

      关于这个的msdn文章:http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.dowork.aspx

      【讨论】:

        猜你喜欢
        • 2013-10-19
        • 1970-01-01
        • 2015-01-26
        • 2018-03-29
        • 1970-01-01
        • 2018-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多