弹出新窗体后界面卡死

ct4477xx 2014-05-22 01:21:26
public void UpdateGrid()
{
using (SqlConnection connection = new SqlConnection(_connStr))
{
using (SqlCommand command = new SqlCommand("select ID From [dbo].[Messages] where isOK=0", connection))
{
command.CommandType = CommandType.Text;
connection.Open();
SqlDependency dependency = new SqlDependency(command);
dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
SqlDataReader sdr = command.ExecuteReader();
while (sdr.Read())
{
int ID = (int)sdr["ID"];
TT.ID = Convert.ToString(ID);
//
try
{
Messagescs x = new Messagescs();
x.Show();
}
catch (Exception re)
{
MessageBox.Show(re.Message);
}


System.Threading.Thread.Sleep(6000);
string updata = string.Format("update [Messages] set isOK=1 where id=" + ID);
SqlCommand upgx = new SqlCommand(updata, connection);
connection.Open();
upgx.ExecuteNonQuery();
connection.Close();
}
sdr.Close();
connection.Close();
}
}
}

public void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
UpdateGrid();
}



这是用SqlDependency 数据库监听做的一个窗体,大概想实现的效果是当有新纪录写入后isok默认是0.然后程序会监听数据库信息,监听到有0的就读取出来,然后更新为isok为1,现在的问题是打开程序后 当数据库写入数据后新弹出来的Messagescs子窗体就会卡死,求指导
...全文
589 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ct4477xx 2014-05-22
  • 打赏
  • 举报
回复
引用 5 楼 wmg494005678 的回复:
关于UI的处理一定是交给UI线程来处理的
最后用ui的线程解决了问题。。
  • 打赏
  • 举报
回复
定义个委托方法,用来打开窗体。 提示用 this.Invoke();
於黾 2014-05-22
  • 打赏
  • 举报
回复
你这是在线程1里又开了个线程2,然后线程2去开窗体,这跟在线程1里开窗体有什么区别么?
ct4477xx 2014-05-22
  • 打赏
  • 举报
回复
引用 4 楼 Z65443344 的回复:
加个全局变量,告诉主线程可以开窗体了,然后在主线程的timer里弹出窗体. 或者线程间加委托,委托给主线程去开窗体. 子线程是不能直接开窗体的.
public void doTask1() { Messagescs x = new Messagescs(); x.Show(); } public void UpdateGrid() { using (SqlConnection connection = new SqlConnection(_connStr)) { using (SqlCommand command = new SqlCommand("select ID From [dbo].[Messages] where isOK=0", connection)) { command.CommandType = CommandType.Text; connection.Open(); SqlDependency dependency = new SqlDependency(command); dependency.OnChange += new OnChangeEventHandler(dependency_OnChange); SqlDataReader sdr = command.ExecuteReader(); while (sdr.Read()) { int ID = (int)sdr["ID"]; TT.ID = Convert.ToString(ID); Thread tskThread1 = new Thread(doTask1); tskThread1.Start(); // //Process ps = new Process(); //ps.StartInfo.FileName = @"Messagescs.exe"; //ps.Start(); //connection.Close(); // System.Threading.Thread.Sleep(6000); string updata = string.Format("update [Messages] set isOK=1 where id=" + ID); SqlCommand upgx = new SqlCommand(updata, connection); connection.Open(); upgx.ExecuteNonQuery(); connection.Close(); } sdr.Close(); connection.Close(); } } } 我这样写后。。提示是这样的。。
ct4477xx 2014-05-22
  • 打赏
  • 举报
回复
引用 4 楼 Z65443344 的回复:
加个全局变量,告诉主线程可以开窗体了,然后在主线程的timer里弹出窗体.
或者线程间加委托,委托给主线程去开窗体.
子线程是不能直接开窗体的.



public void doTask1()
{
Messagescs x = new Messagescs();
x.Show();
}
public void UpdateGrid()
{
using (SqlConnection connection = new SqlConnection(_connStr))
{
using (SqlCommand command = new SqlCommand("select ID From [dbo].[Messages] where isOK=0", connection))
{
command.CommandType = CommandType.Text;
connection.Open();
SqlDependency dependency = new SqlDependency(command);
dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
SqlDataReader sdr = command.ExecuteReader();
while (sdr.Read())
{
int ID = (int)sdr["ID"];
TT.ID = Convert.ToString(ID);
Thread tskThread1 = new Thread(doTask1);
tskThread1.Start();
//

//Process ps = new Process();
//ps.StartInfo.FileName = @"Messagescs.exe";
//ps.Start();
//connection.Close();
//

System.Threading.Thread.Sleep(6000);
string updata = string.Format("update [Messages] set isOK=1 where id=" + ID);
SqlCommand upgx = new SqlCommand(updata, connection);
connection.Open();
upgx.ExecuteNonQuery();
connection.Close();
}
sdr.Close();
connection.Close();
}
}
}




我这样写后。。提示是这样的。。
wmg494005678 2014-05-22
  • 打赏
  • 举报
回复
关于UI的处理一定是交给UI线程来处理的
於黾 2014-05-22
  • 打赏
  • 举报
回复
加个全局变量,告诉主线程可以开窗体了,然后在主线程的timer里弹出窗体. 或者线程间加委托,委托给主线程去开窗体. 子线程是不能直接开窗体的.
ct4477xx 2014-05-22
  • 打赏
  • 举报
回复
引用 2 楼 Z65443344 的回复:
你在子线程中弹出窗体? 窗体应该在主线程中,你在子线程中弹出的窗体,主线程无法控制,也无法显示,感觉就像卡死了一样. 用户操作是在主线程中,包括关闭窗体的按钮点击事件.
求指导。。又设计了一个线程。。然后 一直提示线程已经被关闭....
於黾 2014-05-22
  • 打赏
  • 举报
回复
你在子线程中弹出窗体? 窗体应该在主线程中,你在子线程中弹出的窗体,主线程无法控制,也无法显示,感觉就像卡死了一样. 用户操作是在主线程中,包括关闭窗体的按钮点击事件.
ct4477xx 2014-05-22
  • 打赏
  • 举报
回复


已经卡死了....

111,112

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧