一:一段跨线程访问,给页面内的控件赋值的代码找了半天没找到,还得找了以前写的程序.
在这记下来吧 . 这是其他程序内可以跨线程访问的代码 .
if (gridControl1.InvokeRequired) { gridControl1.BeginInvoke(new MethodInvoker(delegate { gridControl1.DataSource = urlmodellist; })); } else { gridControl1.DataSource = urlmodellist; }
二:这个是关闭创体内的while 循环的bug ,正常情况下关闭窗体,窗体内有死循环的话,窗体关闭了,程序还在后台运行.
解决方法:
1:在窗体的FormClosing事件处理方法中,使用代码System.Environment.Exit(0)强制退出当前进程,这样一来,不管进程下是否还有线程在工作,都会一概结束。
private void frmCase2_FormClosing(object sender, FormClosingEventArgs e)
{ System.Environment.Exit(0);}2:还有一个事件结束的方式. 这种方式的话如果下边程序刚开始进行中.程序等到程序运行到waitone才能关闭,比如程序刚起来,就运行了时间长的操作,只能等到这操作技术,运行到waitone 的地方,才能运行..
while (true) { Console.WriteLine("do some thing"); BrowerUrls(); Thread.Sleep(1000); string cont = SendMail.SendMsg(gridView1); SendEmail("浏览数据", cont); /// Thread.Sleep(_duration); //此处线程挂起比如一个小时,睡着了...... 此处要注销掉 要不下边接收不到信号了...所以导致信号机制无用.....
if (exitEvent.WaitOne(_duration)) //waitone 里边加个时间参数 如果没有信号过来,到了时间也会自动进行while循环,很好的满足当前项目的定时执行的需求 { return; } }
以上用信号事件 顺利的解决窗体关闭,正常退出死循环的问题