C# 在多线程应用程序中冻结
我正在尝试制作一个WinForms多线程应用程序,它在两个不同的线程中无休止地生成异常 一个线程使用C# 在多线程应用程序中冻结,c#,multithreading,winforms,thread-safety,C#,Multithreading,Winforms,Thread Safety,我正在尝试制作一个WinForms多线程应用程序,它在两个不同的线程中无休止地生成异常 一个线程使用GenerateDllNotFoundExc()方法,另一个线程使用另一个方法,这基本相同,但只是生成另一个异常 然后,它将异常消息写入队列,然后从队列写入文本框 然而,GUI总是在1秒后冻结,它会将消息写入文本框,然后冻结。我试着调试它,代码本身可以工作,但是GUI被冻结了 有人能告诉我我做错了什么吗 private delegate void GetQueueElem(); private e
GenerateDllNotFoundExc()
方法,另一个线程使用另一个方法,这基本相同,但只是生成另一个异常
然后,它将异常消息写入队列,然后从队列写入文本框
然而,GUI总是在1秒后冻结,它会将消息写入文本框,然后冻结。我试着调试它,代码本身可以工作,但是GUI被冻结了
有人能告诉我我做错了什么吗
private delegate void GetQueueElem();
private event GetQueueElem getqueuelem;
private void GenerateDllNotFoundExc()
{
Action<String> addelem = new Action<String>(AddToQueue);
string exdll = string.Empty;
while (shouldgeneratemore)
{
try
{
throw new DllNotFoundException();
}
catch (Exception ex)
{
exdll = ex.Message;
}
this.Invoke(addelem, exdll);
}
}
private void AddToQueue(string exmess)
{
lock (lockobject)
queue.Enqueue(exmess);
getqueuelem.Invoke();
}
private void AddToTextBox()
{
while (queue.Count > 0)
{
string s = queue.Dequeue() +"\t" + Thread.CurrentThread.Name
+ "\t" + Thread.CurrentThread.ManagedThreadId + "\t";
lock (lockobject)
textBox1.Text += s;
}
}
private委托void getqueuelem();
私有事件getqueuelem getqueuelem;
私有void GenerateDllNotFoundExc()
{
Action addelem=新操作(AddToQueue);
string exdll=string.Empty;
while(shouldgeneratemore)
{
尝试
{
抛出新的DllNotFoundException();
}
捕获(例外情况除外)
{
exdll=ex.消息;
}
调用(addelem,exdll);
}
}
私有void AddToQueue(字符串exmess)
{
锁定(锁定对象)
queue.Enqueue(exmess);
getqueuelem.Invoke();
}
私有void AddToTextBox()
{
而(queue.Count>0)
{
字符串s=queue.Dequeue()+“\t”+Thread.CurrentThread.Name
+“\t”+Thread.CurrentThread.ManagedThreadId+”\t”;
锁定(锁定对象)
textBox1.Text+=s;
}
}
这个问题很有教育意义,它显示了存在三个主要线程错误的证据。按照它们的普遍程度大致排列:
最终,像这样的消防水管缺陷是一个平衡缺陷。您正在以一种远远高于人类所能观察到的速度更新UI。这不是一个有用的用户界面。这个程序没有实用的建议,它太过合成,故意降低工作线程的速度将是一个解决办法。您在哪里为“shouldgeneratemore”赋值的?为什么在
循环中抛出异常?这有什么意义?在开始时,使用private delegate void getqueuelem()@YuvalItzchakov我希望应用程序无休止地抛出异常,并且当按下停止按钮时,我将“shouldgeneratemore”值设置为“false”以停止