1. 程式人生 > >C# 定時關窗 & 跨執行緒操作視窗

C# 定時關窗 & 跨執行緒操作視窗

新增定時器

直接在程式碼中new一個定時器並繫結回撥函式即可

跨執行緒關閉其他視窗

會報異常: 在這裡插入圖片描述

解決方法: 在你要操作的視窗的類的建構函式中指明允許跨執行緒操作。


    public partial class AlarmInfoWindow : Form
    {
        public AlarmInfoWindow()
        {
            InitializeComponent();
            CheckForIllegalCrossThreadCalls = false; //允許跨執行緒操作此視窗
        }
此處略去不可告人的一千行……

例程:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace EzHostCtrl
{
    public partial class AlarmInfoWindow : Form
    {
        public AlarmInfoWindow()
        {
            InitializeComponent();
            CheckForIllegalCrossThreadCalls = false; //允許跨執行緒操作此視窗
        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void clearnAlarm_Button_Click(object sender, EventArgs e)
        {
            MessageBox.Show("報警已清除");
        }

        /* 自己新增的,用於向listBOX中新增項 */
        public void listBox1_addItem(String str)
        {
            this.AlarmList_listBox.Items.Add(str);

        }
        
    }
}

在這裡插入圖片描述

知道你想複製抄襲,重要部分程式碼:


        public AlarmInfoWindow alarmWindow;
        private void tspbtn_ErrorReport_Click(object sender, EventArgs e)
        {
            alarmWindow = new AlarmInfoWindow();
            alarmWindow.listBox1_addItem("DFDG");
            alarmWindow.Show();
            /*建立定時器*/
            System.Timers.Timer aTimer = new System.Timers.Timer();
            aTimer.Interval = 5000;
            aTimer.Elapsed += ATimer_Elapsed_AlarmWindDead; //定時時間到的時候的回撥函式
            aTimer.AutoReset = false;//這裡填否,不然會反覆執行回撥函式
            aTimer.Enabled = true;  //啟動定時器

        }
        /* 定時器回撥函式 */
        private void ATimer_Elapsed_AlarmWindDead(object sender, System.Timers.ElapsedEventArgs e)
        {
            alarmWindow.Close();          
        }