当前位置: 代码迷 >> C# >> 弹出窗口假死怎么处理
  详细解决方案

弹出窗口假死怎么处理

热度:55   发布时间:2016-05-05 04:45:36.0
弹出窗口假死怎么办?
我的程序有后台程序在读写数据,主窗口UI每秒刷新,然后遇到报警就弹出一个小窗口来显示。
这是我的弹出小窗口代码。现在的问题是弹出来的小窗口不能点击拖动,一碰它就显示未响应死在那儿了。求助应该怎么办。
public static void ShowAlarm(List<Alarm> lstAlarms) 
        {
            if (lstAlarms.Count == 0) return;//lstAlarms是最新的报警,所以不会每秒都来执行后面的程序
            var dlg = dlgAlarm.CreateInstance();
            StringBuilder sb = new StringBuilder();
            foreach (var alarm in lstAlarms)
            {
                var config = frmMain.lstAlarmConfig.Find(p => p.Id == alarm.AlarmConfigId);
                if (config.DialogDisplay == false) continue;
                sb.AppendLine("时间   站点   变量   值   报警信息");                
                alarm._Time = new DateTime(alarm.Time);
                sb.AppendLine(string.Format("{0}   {1}   {2}   {3}   {4}", alarm._Time.ToString("HH:mm:ss"), alarm.StationName, alarm.TagName, alarm.Value, alarm.AlarmMsg));             
            }
            dlg.textBox1.Text = sb.ToString();
            int width = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width;
            int height = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height;
            int top = height - 35 - dlg.Height;
            int left = width - 5 - dlg.Width;
            Point pp = new Point(left, top);
            dlg.PointToScreen(pp);
            dlg.Location = pp;
            dlg.TopMost = true;
            dlg.Show();
            
        }


------解决思路----------------------
当你调用 ShowAlarm 的时候,应该确保在UI主线程调用它。
------解决思路----------------------

 private void button1_Click(object sender, EventArgs e)
        {
            Thread th = new Thread(ShowMessage);
            th.IsBackground = true;
            th.Start();
        }

        //非UI线程的操作方法
        void ShowMessage()
        {
            if (this.InvokeRequired)
            {
                Action<string> Show = (o) =>
                {                    
                    //非UI线程操作UI控件时的方法写到这里
                    //...

                };
                this.Invoke(Show, string.Empty);
            }     
        }
  相关解决方案