再次开始写博客小开头~
线程的提示窗自我感觉还可以,不过看过好多大牛说线程慎用,好像是线程释放的问题,不过如果就一个线程,应该问题不大,如果有对线程深入理解的大牛可解释一二~
开始今日随笔~
首先,新建一个新的窗体RemindWinView,简单加入一个TextBlock,Text=“提示窗 1 号”,主窗体的cs文件里定义线程,并初始化线程,代码如下
1 #region 线程 2 3 //线程状态 4 private bool flag; 5 //定义线程 6 private Thread TRemind; 7 //事件 8 private delegate void ThreadGo(); 9 //是否登录及时提醒(true,初始提醒;false,初始10秒后提醒); 10 private bool IsRemindInTime = true; 11 12 #endregion 13 14 public MainWindow() 15 { 16 InitializeComponent(); 17 18 //启动线程 19 flag = true; 20 //初始化线程 21 TRemind = new Thread(new ThreadStart(threadProc)); 22 //线程运行级别 23 TRemind.Priority = ThreadPriority.Highest; 24 //线程启动前设置单元状态 25 TRemind.SetApartmentState(ApartmentState.STA); 26 //运行线程 27 TRemind.Start(); 28 }
定义线程事件
1 /// <summary> 2 /// 线程事件 3 /// </summary> 4 private void threadProc() 5 { 6 while(flag) 7 { 8 if (IsRemindInTime) 9 { 10 System.Windows.Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new ThreadGo(ThreadToGo)); 11 //立即提醒,每十秒提醒 12 int milSeconds = Convert.ToInt32(10) * 1000; 13 Thread.Sleep(milSeconds); 14 } 15 else 16 { 17 //十秒后开始提醒,每10秒一次 18 int milSeconds = Convert.ToInt32(10) * 1000; 19 Thread.Sleep(milSeconds); 20 System.Windows.Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new ThreadGo(ThreadToGo)); 21 } 22 } 23 }
执行事件
1 /// <summary> 2 /// 执行事件 3 /// </summary> 4 private void ThreadToGo() 5 { 6 if (!IsExistShowView("RemindWinView_name")) 7 { 8 RemindWinView w = new RemindWinView(); 9 w.Left = System.Windows.SystemParameters.PrimaryScreenWidth - w.Width; 10 w.Top = System.Windows.SystemParameters.WorkArea.Height - w.Height; 11 w.Show(); 12 } 13 }
关闭主窗体后对线程一个释放的事件
1 /// <summary> 2 /// 主窗体关闭事件 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="e"></param> 6 private void Window_Closed(object sender, EventArgs e) 7 { 8 //主窗体关闭后,线程停止,否则线程一直在运行 9 TRemind.Abort(); 10 }
还有一个判断,判断提示窗是否存在
1 /// <summary> 2 /// 检查窗体是否存在 3 /// </summary> 4 /// <param name="winName"></param> 5 /// <returns></returns> 6 private bool IsExistShowView(string winName) 7 { 8 bool isExist = false; 9 10 foreach (Window win in Application.Current.Windows) 11 { 12 if (win.Name == winName) 13 { 14 isExist = true; 15 win.Activate(); 16 break; 17 } 18 } 19 return isExist; 20 }
我记得WPF还有一个提示窗,暂时下忘记了,如果想起来的话,再加上吧~
原文:http://www.cnblogs.com/shadow-fei/p/4596313.html