程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 我眼中委托的真正面貌(二)(6)

我眼中委托的真正面貌(二)(6)

編輯:關於C語言

確定子線程創建無誤,編譯也通過了。但是,運行時卻出現了這樣的錯誤:

原來,C#中是不支持跨線程操控控件的。不過,出於安全考慮,這樣做也是合情合理,這樣可以避免多個線程同時操控一個控件所帶來的程序運行錯誤。那麼,如何來實現這樣的效果呢?

方法一:將 Control.CheckForIllegalCrossThreadCalls 屬性設置為 false。你可以嘗試給窗體添加Form_Load()事件,然後在事件函數體中對這個屬性進行設置。

編譯就會發現,程序已經可以順利執行了。這個方法比較簡單,但始終不太安全。所以我們不推薦這樣的用法。

方法二:用委托來實現

using System.Threading;

namespace MulTrdDelegate
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //定義委托類型
        public delegate void TreadDelgate();

        //初始化子線程對象
        private Thread demoThread = null;

        private void button1_Click(object sender, EventArgs e)
        {
            demoThread = new Thread(new ThreadStart(ThreadProcUnsafe));

            demoThread.Start();
        }

        public void ThreadProcUnsafe()
        {
            SetText();
        }

        private void SetText()
        {
            string text = "這個控件的內容是由子線程實現的";

            if (this.textBox1.InvokeRequired)
            {
                TreadDelgate Objdelegate = new TreadDelgate(SetText);

                this.Invoke(Objdelegate, new object[] {});
            }
            else
            {
                this.textBox1.Text = text;
            }
        }
    }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved