C#从线程更新表格&类

时间:2009-09-07 00:23:25

标签: c# winforms class multithreading

我正在处理项目,并且在线程和UI更新方面存在问题。我在网站和本网站上阅读了很多帖子,但没有找到我的问题的答案。

我正在制作等待端口XXXX上的某些UDP数据的程序。在分离的线程中循环。当数据到来时,他提取信息并将其放入缓冲区,然后返回等待另一个数据。另一个线程例程在缓冲区中等待数据并将其发送到电子邮件。

由于功能和代码设计,我有Form1类(UI) - 主线程,Class2(用于读取UDP和提取数据的rutine) - secodn线程,Class3(读取缓冲区和发送邮件) - 第三个线程,Class4(队列缓冲区) (读,写,删除项目))...

问题是,当我想要从类I更新UI时,得到了BufferOwerflow Exception ...这是合乎逻辑的,因为我首先必须创建实例,如果Class启动线程并且在Class I中必须使Form的实例传递数据,并且然后我们有无限循环。

我在这里发现的所有帖子都是关于线程的更新UI,但是在同一个类中。由于实例,我理解有关堆栈和循环的问题。我只是不想拥有一个包含大量代码的大型主类...

是否可以在主窗体中更新另一个类和线程例程?

我从脑袋里写了一些例子(它不起作用)只是为了弄清楚我在说什么。

namespace ThreadUIClass
{
    public delegate void updateTextBoxDelegate(string text);

    public partial class Form1 : Form
    {
        void updateTextBox(string text)
        {
            textBox.Text = text;
        }
        public Form1()
        {
            InitializeComponent();
            Go();
        }
        public void Go()
        {
            textBox.Text = "START";
            DoWork dW = new DoWork(); //<= instance of work class
            Thread myThread = new Thread(dW.WorkInBeckground);
            myThread.IsBackground = true;
            myThread.Start();
        }
    }
    public class DoWork
    {
        public void WorkInBeckground()
        {
            while (true) //loop and wait for data
            {
                // Listen some ports and get data
                // If (data==ok) update main UI textbox with status
                Form1 myForm = new Form1();  //<= instance of main class
                myForm.Invoke(new updateTextBoxDelegate(???updateTextBox), new object[] { "BUFFER LOADING..." });
                Thread.Sleep(1000);
                // Continue looping.....
            }
        }
    }
}

2 个答案:

答案 0 :(得分:3)

您需要使用threadstart对象并传入对表单对象的引用。你实际上在做的是创建一个对你的mainform的新引用,然后开始一个线程,这反过来做同样的事情。

所以只需使用一个paramaterizedthreadstart对象启动你的线程,传入“this”就可以了。你应该没问题。

MSDN ParameterizedThreadStart

答案 1 :(得分:2)

使用BackgroundWorker实现这一目标会不会更好?有一个非常好的example here。这个类是UI线程识别的,你可以直接调用UI组件。