我正在处理项目,并且在线程和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.....
}
}
}
}
答案 0 :(得分:3)
您需要使用threadstart对象并传入对表单对象的引用。你实际上在做的是创建一个对你的mainform的新引用,然后开始一个线程,这反过来做同样的事情。
所以只需使用一个paramaterizedthreadstart对象启动你的线程,传入“this”就可以了。你应该没问题。
答案 1 :(得分:2)
使用BackgroundWorker实现这一目标会不会更好?有一个非常好的example here。这个类是UI线程识别的,你可以直接调用UI组件。