线程结构

时间:2011-12-27 15:45:54

标签: c# multithreading

我写了一些C#代码,在其中我通过将它放在自己的线程中来启动一个类,所以它不会冻结我启动它的GUI:

这来自我的表格类:

    Execute_Recipe execute;
    execute = new Execute_Recipe(XCoordinatesList, YCoordinatesList, Zref, Voltref,
              widget, record, filename);
    Thread executethread = new Thread(new ThreadStart(execute.RunRecipe));

然后在我的Execute Class中创建一个新类来记录数据。这是我的执行类:

    record1 = new Record_Recipe(XCoordinateList1, YCoordinateList1, Zref1, Voltref1, filename1);

最后在我的记录课中,我将数据发送到新表格。要显示。所以最后我启动的所有子类都是在这个线程中创建的。我知道现在的结构是absolutley疯了,软件已处于发展阶段,但这里是我的问题:

如何在我自己的线程中执行并记录我的程序时,如何将两个表单类保留在自己的线程中?

我是否为执行创建了一个线程,为我的录制创建了一个线程,还为我的显示创建了一个背景工作者?然后在线程之间交谈? (根据我的理解,在线程之间进行交谈并不容易)

我只是一名中级程序员,如果你能够/愿意帮助解决这个问题,我会提前感谢你。

2 个答案:

答案 0 :(得分:1)

在C#

中,在线程之间进行交谈非常容易
            yourform.BeginInvoke((MethodInvoker)delegate()
            {
                yourform.button.Text = "new label";
                //More stuff here
            });

可以从工作线程使用某种构造来更新UI线程。如果要创建许多具有较小生命周期的非UI线程,请考虑使用ThreadPool

对于简单的ui更新,还可以查看INotifyPropertyChanged,它可以让您轻松更新数据绑定控件。

答案 1 :(得分:0)

您调用Application.Run()的线程是必须执行所有GUI内容的线程。 Windows.Forms.Control基类有一个Invoke()方法,只要GUI线程处于空闲状态(Form就是Control),就可以调用委托。 .NET中有很多其他机制可以在线程之间进行通信。

与非GUI线程进行通信有点习惯了,但有很多选择。例如,使用WaitHandle的示例如下:

  • 接收线程等待信号
  • 发送线程写入数据
  • 发送线程集信号
  • 接收线程读取数据并执行任务

通常一个线程(“主线程”)引导,其他线程等待工作,或者被创建,完成工作并在之后被销毁。

我建议您检查MSDN上的System.Threading命名空间,看看有什么可用。 http://www.albahari.com/threading/似乎也涵盖了这一切。