c#跨线程访问的代码和窗体关闭退出死循环的代码

一:一段跨线程访问,给页面内的控件赋值的代码找了半天没找到,还得找了以前写的程序.

在这记下来吧 .  这是其他程序内可以跨线程访问的代码 .

             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; }

}

以上用信号事件 顺利的解决窗体关闭,正常退出死循环的问题

原文地址:https://www.cnblogs.com/zuochanzi/p/9930240.html