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線程正在運行創建和啓動我的線程的方法。 –