c#线程应用程序出错
本文关键字:程序出错 应用 线程 | 更新日期: 2023-09-27 17:50:33
我创建了4个在线考试时间监控项目
- ASP。NET应用于考试
- 业务流程和数据访问类库
- 数据库执行类库
- 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
{
}
}
}
你知道这是什么吗?
CheckForIllegalCrossThreadCalls = false;
你在明确地关闭检查你做错了什么。这表明你知道不应该在非UI线程上修改UI,但你还是这样做了。如果你没有那行代码,你的肯定会在Visual Studio中运行时得到异常。
这至少是一个问题。你的TimeOption
方法在一个非UI线程上运行,但是它正在修改UI。千万别这么做。还有各种其他选项,包括BackgroundWorker
和Control.Invoke/BeginInvoke
。
然后……
- 你在
TimeOption
和getTrigger
中都有紧环。基本上,您将永远地对数据库进行重击。这真是个坏主意。您应该至少在迭代之间有一个延迟 - 你有空
catch
块到处都是:catch {}
。这基本上是在宣称,无论出了什么问题,你都没事——你可以继续前进,忽略它,甚至不用记录发生了什么。不要那样做。 - 你正在使用
Thread.Abort
杀死线程。不要那样做。在这种情况下,使用易失性bool
字段来指示何时完成,并在每次循环迭代时检查它将非常简单。
我怀疑问题是由于你不适当的访问UI从一个不同的线程-但我不能肯定地说。解决以上所有问题,你将有一个更好的代码库,然后诊断仍然存在的任何问题。