winform跨線程更新ui,簡短總結一下C#里跨線程更新UI(轉)

 2023-12-06 阅读 29 评论 0

摘要:摘自:?http://my.oschina.net/sdqxcxh/blog/53707 ? ? ? ?跨線程更新UI是寫多線程程序尤其是通信類的程序經常遇到的問題,這里面主要的問題是沖突,比如數據線程想要更新UI的時候,用戶同時也在更新UI,就會出現爭用。C#里可以用 Control.CheckForIl

摘自:?http://my.oschina.net/sdqxcxh/blog/53707

? ? ? ?跨線程更新UI是寫多線程程序尤其是通信類的程序經常遇到的問題,這里面主要的問題是沖突,比如數據線程想要更新UI的時候,用戶同時也在更新UI,就會出現爭用。C#里可以用

Control.CheckForIllegalCrossThreadCalls = false;

????? 來關閉跨線程檢測。但是這樣做有一定的風險,容易讓程序崩潰。

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

winform跨線程更新ui。?

????? 一個簡單的例子如下:(注,Form1 加入了一個名為txt的TextBox)

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格式傳遞參 數。

轉載于:https://www.cnblogs.com/candyzhmm/p/5784130.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/192073.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息