【问题标题】:Communicating with another thread与另一个线程通信
【发布时间】:2011-03-06 21:40:59
【问题描述】:

这就是我创建一个执行reps 次的线程的方式:

protected virtual void RedButtonClicked(object sender, System.EventArgs e)
{
    Nuker n = new Nuker(target, reps);
    bombThread = new Thread(new ThreadStart(n.nuke));
    bombThread.Start();
}

线程类:

public class Nuker
{
    private string target;
    private int reps;
    //...
    public void nuke()
    {
        for(int i=0; i<reps; ++i)
        {
            ICBM.nuke(target);
            Thread.Sleep(5500);
        }
    System.Console.WriteLine("Done.");
    }
}

(我创建了一个新类来存储一些变量,因为我无法在ThreadStart() 中传递这些变量。)

现在我想对过程进行简单的可视化,假设在表单的文本字段中打印当前重复。我将如何使用循环中的i 来做到这一点?

【问题讨论】:

    标签: c# multithreading gtk


    【解决方案1】:

    在最简单的形式中,您证明了 Nuker 类中的回调

    public Nuker(string target, int reps, Action reportCallback){..}

    在循环中你只需调用reportCallback(i);

    Nuker n = new Nuker(target, reps, ReportMethod);
    

    private void ReportMethod(int currentIdx)
    {
        if (InvokeRequired) // Invoke if UI update
        ...
    }
    

    但是,您可能想使用 BackgroundWorker,它具有用于报告 UI 线程进度的内置方法。只需查看 MSDN 上的示例。

    【讨论】:

      【解决方案2】:

      您可以使用后台工作者来完成,这是最简单的线程之一 :-) 下面我向您发布了我创建的示例,以教一些朋友使用 backgroundworker ;-)

      private BackgroundWorker bw = new BackgroundWorker();
      
      public Form1()
      {
          InitializeComponent();
          bw.WorkerReportsProgress = true;
          bw.WorkerSupportsCancellation = true;
          bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
          bw.DoWork += new DoWorkEventHandler(bw_DoWork);
          bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
      }
      
      public void buttonStart_Click(object sender, EventArgs e)
      {
          if (bw.IsBusy != true)
              bw.RunWorkerAsync(12); //Start
      }
      
      public int Pils(int i)
      {
          Thread.Sleep(2000);
          bw.ReportProgress(70, "In the middle of the work..");
          Thread.Sleep(2000);
          bw.ReportProgress(90, "Returning the result..");
          Thread.Sleep(2000);
          return (2 * i);
      }
      
      private void bw_DoWork(object sender, DoWorkEventArgs e)
      {
          bw.ReportProgress(20, "Waiting for cancel.."); 
          Thread.Sleep(2000);
          if ((bw.CancellationPending == true))
              e.Cancel = true;
          else
          {
              bw.ReportProgress(50, "Starting process..");
              e.Result = Pils((int)e.Argument);
          }
      }
      
      private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
      {
          bw.ReportProgress(100, "Work done.."); 
          if ((e.Cancelled == true))
               textBox1.Text = "Canceled!";
          else if (e.Error != null)
               textBox1.Text = ("Error: " + e.Error.Message);
          else textBox1.Text = e.Result.ToString();
      }
      
      private void buttonCancel_Click(object sender, EventArgs e)
      {
          if (bw.WorkerSupportsCancellation == true)
              bw.CancelAsync();
      }
      
      private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
      {
          listBox1.Items.Add((e.ProgressPercentage.ToString() + "%") + " - " + e.UserState as String);
      }
      

      博文网址:link

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-09
        • 2020-02-16
        • 1970-01-01
        • 2020-11-21
        • 2014-07-25
        • 2011-02-14
        • 1970-01-01
        相关资源
        最近更新 更多