簡短總結一下C#裏跨線程更新UI

       跨線程更新UI是寫多線程程序尤爲是通訊類的程序常常遇到的問題,這裏面主要的問題是衝突,好比數據線程想要更新UI的時候,用戶同時也在更新UI,就會出現爭用。C#裏能夠用多線程

Control.CheckForIllegalCrossThreadCalls = false;

      來關閉跨線程檢測。可是這樣作有必定的風險,容易讓程序崩潰。函數

      最好的辦法是經過Invoke,這篇博客只是提供一個示例,至於那些線程同步、Invoke和BeginInvoke,Invoke底層實現神馬的,有空再說吧。測試

      一個簡單的例子以下:(注,Form1 加入了一個名爲txt的TextBox)ui

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;using System.Threading;namespace testThread{
    public partial class Form1 : Form {
        private delegate void InvokeCallback(string msg); //定義回調函數(代理)格式 public Form1()
        {
            InitializeComponent();
            Control.CheckForIllegalCrossThreadCalls = false;//關閉跨線程調用檢測 MyMessage m = new MyMessage();//一個消息源 //啓動一個線程,把界面對象傳遞過去 Thread t = new Thread(new ParameterizedThreadStart(m.Test));
            t.Start((object)this);
        }
        //Invoke回調函數 public void UpdateText(string text)
        {
            if (txt.InvokeRequired)//當前線程不是建立線程 txt.Invoke(new InvokeCallback(UpdateText),new object[]{text});//回調 else//當前線程是建立線程(界面線程) txt.Text = text;//直接更新 }
    }
    //消息源 class MyMessage {
        public void Test(object para)
        {
            Form1 form = (Form1)para;
            form.UpdateText("測試");
        }
    }
}

      上面的例子很簡單,主要是須要判斷一下當前線程是否是控件的建立線程,若是是就直接更新,不然創建一個Invoke對象,設置好代理和參數,而後調用Invoke。須要注意的是創建線程的時候若是須要傳參數,應該經過ParameterizedThreadStart創建而且以object格式傳遞參數。this

相關文章
相關標籤/搜索