当前位置:编程学习 > C#/ASP.NET >>

奇怪的线程切换问题,不知道问题在何处?

有个线程执行体如下:

 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弹出,但是一片空白,程序失去响应。 --------------------编程问答--------------------
引用 3 楼 lianshaohua 的回复:
线程同步的问题;尽量不要在线程中修改其它线程创建的界面控件;


为什么? 创建界面控件实际上也是代码段。 --------------------编程问答-------------------- 只有这一个线程吗?
ShowMessageBox方法是什么? --------------------编程问答-------------------- Invoke,比如
if (this.InvokeRequired)
{   
    this.Invoke( ShowMessageBox("xxxxxx"));
} --------------------编程问答--------------------
引用 6 楼 zzx509 的回复:
只有这一个线程吗?
ShowMessageBox方法是什么?


是的,只有一个线程,线程的启动逻辑:

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 --------------------编程问答--------------------
引用 8 楼 phiyano 的回复:
DialogResult result = MessageBox.Show("xxxx");    
if (result == DialogResult.Yes) 

你的这两句是什么用意?result只能有DialogResult.OK一种情况。不会出现YES
先将这个错误改正看看。
exportAccLog这个方法又是什么? --------------------编程问答--------------------
引用 5 楼 phiyano 的回复:
引用 3 楼 lianshaohua 的回复:

线程同步的问题;尽量不要在线程中修改其它线程创建的界面控件;


为什么? 创建界面控件实际上也是代码段。

去掉你的ShowMessageBox();然后用log来代替,看还会不会出问题吧;线程中操作UI是需要同步的;至于原因不做多说;
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,