奇怪的线程切换问题,不知道问题在何处?
有个线程执行体如下:
private void exportLog()
{
try
{
lock (saveFileDialog1) // 这个锁在其它线程中也会使用
{
if (datatable.Rows.Count == 0)
{
ShowMessageBox("xxxxxx");
return; //怀疑出现问题的地方可能在这里,但是不确定。
}
}
}
catch (ThreadAbortException e)
{
log.Debug(e);
Thread.ResetAbort();
}
catch (Exception ex)
{
}
}
线程是通过点击按钮触发的,出现的现象是:datatable.Rows.Count == 0的时候,频繁点击按钮程序僵死。
MessageBox弹着弹着就动不了了,不知道原因是啥,如何解决?
--------------------编程问答-------------------- 线程在哪? --------------------编程问答-------------------- 描述一个你的错误吧,这样别人才能帮到你 --------------------编程问答-------------------- 线程同步的问题;尽量不要在线程中修改其它线程创建的界面控件; --------------------编程问答-------------------- 不好意思,代码是线程的执行体,我定义了一个线程thread1,每当点击某个按钮的时候就会触发这个函数执行。
按照上面的代码,
假设条件满足并能够弹出MessageBox,连续点击button触发线程执行 去显示MessageBox, 通常速度不是很快的时候没有什么问题,但是在高速点击下,程序会出现以下现象:
MessageBox弹出,但是一片空白,程序失去响应。 --------------------编程问答--------------------
为什么? 创建界面控件实际上也是代码段。 --------------------编程问答-------------------- 只有这一个线程吗?
ShowMessageBox方法是什么? --------------------编程问答-------------------- Invoke,比如
if (this.InvokeRequired)
{
this.Invoke( ShowMessageBox("xxxxxx"));
} --------------------编程问答--------------------
是的,只有一个线程,线程的启动逻辑:
if (thread1 == null || !thread1 .IsAlive)
{
thread1 = new Thread(new ThreadStart(exportLog));
thread1 .SetApartmentState(ApartmentState.STA);
thread1 .Start();
}
else
{
thread1 .Suspend();
DialogResult result = MessageBox.Show("xxxx");
if (result == DialogResult.Yes)
{
thread1 .Resume();
thread1 .Abort();
thread1 = new Thread(new ThreadStart(exportAccLog));
thread1 .SetApartmentState(ApartmentState.STA);
thread1 .Start();
}
else
{
thread1 .Resume();
}
}
ShowMessageBox() 新建一个MessageBox,并返回DialogResult --------------------编程问答--------------------
你的这两句是什么用意?result只能有DialogResult.OK一种情况。不会出现YES
先将这个错误改正看看。
exportAccLog这个方法又是什么? --------------------编程问答--------------------
去掉你的ShowMessageBox();然后用log来代替,看还会不会出问题吧;线程中操作UI是需要同步的;至于原因不做多说;
补充:.NET技术 , C#