C#从线程和;班

C#从线程和;班,c#,winforms,class,multithreading,C#,Winforms,Class,Multithreading,我在项目中工作,对UI的线程和更新有问题。我在网上和这个网站上读了很多帖子,但并没有找到我问题的答案 我正在制作一个程序,在端口XXXX上等待一些UDP数据。在分离的线程中循环。当数据到来时,他提取信息并将其放入缓冲区,然后返回等待另一个数据。另一个线程例程等待缓冲区中的数据并将其发送到电子邮件 由于功能和代码设计,我有1类(UI)-主线程,2类(rutine用于读取UDP和提取数据)-secodn线程,3类(读取缓冲区和发送邮件)-第三个线程,4类(队列缓冲区(读取、写入、删除项)) 问题是,

我在项目中工作,对UI的线程和更新有问题。我在网上和这个网站上读了很多帖子,但并没有找到我问题的答案

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

由于功能和代码设计,我有1类(UI)-主线程,2类(rutine用于读取UDP和提取数据)-secodn线程,3类(读取缓冲区和发送邮件)-第三个线程,4类(队列缓冲区(读取、写入、删除项))

问题是,当我想从类中的一个更新UI时,我得到了BufferOwerflow异常…这是合乎逻辑的,因为我首先必须创建类的实例来开始线程,在类中我必须创建表单的实例来传递数据,然后我们有无限循环

我在这里找到的所有帖子都是关于从线程更新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.....
            }
        }
    }
}
命名空间线程类
{
公共委托void updateTextBoxDelegate(字符串文本);
公共部分类Form1:Form
{
无效updateTextBox(字符串文本)
{
Text=Text;
}
公共表格1()
{
初始化组件();
Go();
}
公开作废Go()
{
textBox.Text=“开始”;

DoWork dW=new DoWork();//您需要使用threadstart对象并传入对表单对象的引用。您实际要做的是创建对mainform的新引用,这反过来会启动一个线程,而线程又会执行同样的操作

因此,只需使用paramaterizedthreadstart对象启动线程,传入“this”,就可以了


您需要使用threadstart对象并传入对表单对象的引用。您实际要做的是创建对mainform的新引用,这反过来会启动一个线程,而线程又会做同样的事情

因此,只需使用paramaterizedthreadstart对象启动线程,传入“this”,就可以了


使用来实现这一点不是更好吗?有一个非常好的方法。这个类是UI线程感知的,您可以直接调用UI组件。

使用来实现这一点不是更好吗?有一个非常好的方法。这个类是UI线程感知的,您可以直接调用UI组件。

但是您仍然我需要告诉BackgroundWorker必须进入工作类?你必须制作该类的实例…但你仍然需要告诉BackgroundWorker必须进入工作类?你必须制作该类的实例。。。。