1

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

  1. ASP.NET 申请考试
  2. 业务流程和数据访问的类库
  3. 类库到数据库执行
  4. 用于监控考试时间的 Windows 窗体应用程序

在 Windows 表单应用程序中,我在新考试开始时使用线程进行监控,并且我想在 5 分钟前发出通知以结束考试。

使用 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
        {
        }
    }       
}
4

1 回答 1

4

你知道这是做什么的吗?

CheckForIllegalCrossThreadCalls = false;

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

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

然后...

  • 您在TimeOption和中都有紧密的循环getTrigger。基本上,您将永远用力地敲击数据库。这真是个坏主意。您至少应该在迭代之间有延迟
  • catch到处都是空块:catch {}。这基本上是在声称无论出了什么问题,你都很好——你可以继续前进并忽略它,甚至不需要记录发生的事情。不要那样做。
  • Thread.Abort用来杀死你的线程。不要那样做。在这种情况下,使用 volatilebool字段指示您想要完成的时间会非常简单,并在循环的每次迭代中检查它。

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

于 2013-01-04T06:53:46.913 回答