1
我正在尝试执行我的第一个多线程窗体表单应用程序,并且我有1个重要问题。 我知道我必须在我的线程中使用Invoke或BeginInvoke来更改我的表单中的RichTextBox,但是当我尝试这样做时,我的UI只是冻结,而控制台正确打印我的结果。调用冻结我的Windows窗体
class MyThread
{
public MyThread()
{
}
public void Run()
{
byte[] tmp;
while (true)
{
// lock (sem1)
Monitor.Enter(sem1);
{
if (end)
{
Monitor.Exit(sem1);
break;
}
tmp = inp.ReadNr();
if (inp.End())
end = true;
}
if(inOrder)
Monitor.Enter(sem2);
Monitor.Exit(sem1);
bool p = CSL.checkNr((byte[])tmp.Clone());
Monitor.Enter(sem3);
if(inOrder)
Monitor.Exit(sem2);
{
outp.WriteNr(tmp, p);
//win.richTextBox2.AppendText(String.Join("", tmp) + '\n');
win.richTextBox2.BeginInvoke(new Action(delegate()
{
win.richTextBox2.AppendText("wtf");
}));
}
Monitor.Exit(sem3);
}
}
}
“赢” 是我的Form1类的对象。我不能对付它......
编辑:
static public void loading()
{
outp = new oFile();
Thread[] thr = new Thread[nrThreads];
for (int a = 0; a < nrThreads; a++)
new Thread(new ThreadStart(new MyThread().Run)).Start();
//new MyThread().Run();
Console.ReadKey();
}
形式:
private void button1_Click(object sender, EventArgs e)
{
Program.loading();
}
“Run”方法是在后台线程还是UI线程上运行? – adv12
作为一个方面说明,直接使用'Monitor.Enter'和'Monitor.Exit'而不是'lock'语句是不寻常的,可能是一个坏主意,除非你真的知道你在做什么。例如,如果你在'Enter'和'Exit'之间的代码引发一个异常,那么该对象将保持锁定状态。 – adv12
@ adv12我刚刚编辑我的帖子如何运行我的线程。 UI线程正在运行创建和启动我的线程的方法。 –