c#线程应用程序出错

本文关键字:程序出错 应用 线程 | 更新日期: 2023-09-27 17:50:33

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

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

在Windows窗体应用程序中,我使用线程监视新考试开始时,我想在5分钟前通知结束考试。

当使用visual studio调试应用程序时,它没有得到任何错误。但是手动点击。exe文件并运行应用程序,它会得到一个错误"application stopped working"

这是我的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
        {
        }
    }       
}

c#线程应用程序出错

你知道这是什么吗?

CheckForIllegalCrossThreadCalls = false;

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

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

然后……

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

怀疑问题是由于你不适当的访问UI从一个不同的线程-但我不能肯定地说。解决以上所有问题,你将有一个更好的代码库,然后诊断仍然存在的任何问题。