C#线程应用程序出错

时间:2013-01-04 06:42:43

标签: c# winforms multithreading

我创建了4个在线考试时间监控项目

  1. ASP.NET应用程序检查
  2. 业务流程和数据访问类库
  3. 类库到数据库的执行
  4. 用于监控考试时间的Windows表单应用程序
  5. 在Windows表单应用程序中,我在新的考试开始时使用线程进行监控,我想在5名munites之前发出通知以结束考试。

    使用visual studio调试应用程序时没有收到任何错误。但手动单击.exe文件并运行应用程序时出现错误“应用程序停止工作”

    这是我的Windows窗体应用程序代码

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        Thread t;
        Thread t1;
    
        private void Form1_Load(object sender, EventArgs e)
        {
    
            fillList();           
            CheckForIllegalCrossThreadCalls = false;
            t= new Thread(()=>getTrigger());
            t1 = new Thread(() => TimeOption());
            t.Start();
            t1.Start();
           // getTrigger();
        }
    
    
        private  void getTrigger()
        {
    
            int temp = StudentExamDB.getPendingCount();
    
            while (true)
            {
                if (temp != StudentExamDB.getPendingCount())
                {
                    fillList();
                    temp = StudentExamDB.getPendingCount();
    
                }
            }
    
        }
        List<string> added = new List<string>();
        private void TimeOption()
        {
            while(true)
            {
                DataTable dt = StudentExamDB.getFinishingList();
                foreach (DataRow dr in dt.Rows)
                {
                    try
                    {
                        for (int i = 0; i < dataGridView1.Rows.Count; i++)
                        {
    
                            if (dataGridView1.Rows[i].Cells["enrollmentid"].Value.ToString() == dr["enrollmentid"].ToString())
                            {
                                if (added.Contains(dr["enrollmentid"].ToString()))
                                {
                                }
                                else
                                {
                                    notifyIcon1.BalloonTipTitle = "Ending Some Examinations";
                                    notifyIcon1.BalloonTipText = "click here to show more details about examination time";
                                    notifyIcon1.ShowBalloonTip(5000);
    
                                    added.Add(dr["enrollmentid"].ToString());
    
    
    
                                }
                                dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.Tomato;
                                dataGridView1.Rows[i].DefaultCellStyle.ForeColor = Color.White;
    
    
    
                            }
                        }
                    }
                    catch
                    {
                    }
                }
            }            
        }
    
        private void fillList()
        {
            try
            {
                dataGridView1.DataSource = StudentExamDB.getPendingList();
            }
            catch
            {
            }            
        }
    
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            t.Abort();
            t1.Abort();
        }
    
        private void setToFinishedToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                StudentExamDB.updateStatus(int.Parse(dataGridView1.CurrentRow.Cells["enrollmentid"].Value.ToString()));
                fillList();
    
            }
            catch
            {
            }
        }       
    }
    

1 个答案:

答案 0 :(得分:4)

你知道这是做什么的吗?

CheckForIllegalCrossThreadCalls = false;

明确地关闭你做错的检查。这表明您知道您不应该在非UI线程上修改UI,但无论如何您都在这样做。如果你没有那行代码,那么在Visual Studio中运行时,你肯定会 获得异常。

这至少是一个的问题。您的TimeOption方法正在非UI线程上运行,但它正在修改UI。只是不要这样做。还有其他各种选项,包括BackgroundWorkerControl.Invoke/BeginInvoke

则...

  • TimeOptiongetTrigger都有紧密的循环。基本上,你将永远在努力地敲击数据库。这是一个非常糟糕的主意。您应该至少在迭代之间有延迟
  • 您到处都有空catch块:catch {}。这基本上声称无论出现什么问题,你都没关系 - 你可以继续前进并忽略它,甚至不记录发生了什么。不要那样做。
  • 您正在使用Thread.Abort来杀死您的主题。不要那样做。在这种情况下,使用指示何时完成的volatile bool字段非常简单,并在循环的每次迭代中检查它。

怀疑问题是由于您从不同的线程不恰当地访问UI - 但我不能肯定地说。修复上述所有内容,您将拥有更好的代码库,然后诊断仍然存在的任何问题。