C# 跨執行緒訪問控制元件
因為C#安全機制的問題,不是本執行緒建立的控制元件,是不能直接訪問的。
以下提供了兩種解決辦法:
一、讓程式不檢查跨執行緒呼叫,加入一行程式碼就可以了,但這樣背離了C#安全機制的初衷;
二、建立委託,利用C#的Invoke方法來執行跨執行緒呼叫。
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 thread { public partial class Form1 : Form { Thread t; int count = 0; private delegate void SetTextCallback();//方法二、利用委託代理(推薦) public Form1() { //方法一,加入下面這句讓程式不檢查跨執行緒呼叫是否合法(全域性變數,慎用!!) Control.CheckForIllegalCrossThreadCalls = false; InitializeComponent(); t = new Thread(new ThreadStart(ThreadLb)); t.Start(); } private void ChangeLb() { if (this.lb1.InvokeRequired)//判斷是否跨執行緒呼叫 { SetTextCallback d = new SetTextCallback(ChangeLb); //this.BeginInvoke(d);//非同步呼叫代理 this.Invoke(d); //同步呼叫委託 } else { count++; this.lb1.Text = count.ToString(); } } private void ThreadLb() { while(true) { Thread.Sleep(30); ChangeLb(); } } } }
相關推薦
C# 跨執行緒訪問控制元件
因為C#安全機制的問題,不是本執行緒建立的控制元件,是不能直接訪問的。以下提供了兩種解決辦法:一、讓程式不檢查跨執行緒呼叫,加入一行程式碼就可以了,但這樣背離了C#安全機制的初衷;二、建立委託,利用C#的Invoke方法來執行跨執行緒呼叫。using System; usin
C#執行緒間操作無效(跨執行緒訪問控制元件)
很多朋友在剛接觸Winfrom的時候會遇到這個問題:執行緒間操作無效,從不是建立控制元件textbox1的執行緒訪問它。 這裡有提供兩種解決方法。 第一種 System.Windows.Form
2017.10.20 C#跨執行緒操作控制元件的執行緒安全方法
C#跨執行緒操作控制元件的執行緒安全方法 在C#中,經常用到這樣一個場景,Windows Form程式啟動一個工作者執行緒執行一部分工作,這樣做是為了避免速度慢的工作如果直接呼叫會使得主Form停止響應一段時間。 既然啟動了執行緒,就避免不了執行緒之間資料傳遞的事情,相信你有很多種辦法
跨執行緒訪問控制元件拋異常的解決方法
方法1:關閉跨執行緒操作的檢查,在建構函式裡面新增:System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;,但是此方法不推薦使用。 方法2:(推薦使用此方法)在訪問的地方找回建立控制元件的執
非同步委託跨執行緒訪問控制元件解決介面卡死
下面來看第二種方案,就是使用delegate和invoke來從其他執行緒中控制控制元件資訊。網上有很多人寫了這種控制方式,然而我看了很多這種帖子,表明上看來是沒有什麼問題的,但是實際上並沒有解決這個問題,首先來看網路上的那種不完善的方式: public partial cl
C#跨執行緒獲取控制元件的引數
線上程ThreadTask1中需要跨執行緒訪問Form上ComboBoxSerialPort控制元件的Text屬性: 1. 傳統方法 定義一個可返回object的委託(系統庫中沒找到這樣的委託,只好自己寫一個): delegate object obj_delegate(
C#跨執行緒訪問winform控制元件的方法
方法一:System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false; 不推薦使用這種方式,禁止編譯器對跨執行緒訪問做檢查的方式實現。 方法二:使用delegate和invoke
c#winform跨執行緒操作控制元件的一種方法,InvokeRequired
在winform裡面如果有建立新執行緒的話,線上程裡面直接操作控制元件或修改控制元件的屬性是不允許的,雖然有辦法讓程式執行時忽略跨執行緒可能產生的問題,從而解決;但是從科學的角度看,該辦法並不可取,所以我就用了InvokeRequired的辦法解決跨執行緒操作問題。
C# 多執行緒與跨執行緒訪問介面控制元件
在編寫WinForm訪問WebService時,常會遇到因為網路延遲造成介面卡死的現象。啟用新執行緒去訪問WebService是一個可行的方法。 典型的,有下面的啟動新執行緒示例: private void LoadRemoteAppVersion()
C# 跨執行緒呼叫窗體控制元件
//定義委託 delegate void MyInvoke(string s); //呼叫方法 private void SetText(string s) {
C#(Winform) 跨執行緒訪問解決辦法
網上的資料很多,這裡直接摘抄。 1、關閉跨執行緒檢查。 CheckForIllegalCrossThreadCalls = false; 2、通過委託的方式,在控制元件的執行緒上執行。 using System;using System.Thread
C# 多執行緒,跨執行緒訪問
private void button4_Click(object sender, EventArgs e) { Thread thread1 = new Thread(ShowResult);
WPF中UI元素跨執行緒訪問
C#中跨執行緒訪問UI dotnet中執行緒資源獨佔UI元素,不能跨執行緒訪問,可以通過Dispatcher.Invoke的方式呼叫,但實際處理還是UI執行緒中,任務量比較大的資料會增加執行緒的處理壓力。 其實還有一種做法,可以通過設定UI元素為只讀的方式,跨執
C++ 多執行緒併發控制——互斥鎖 pthread_mutex
問題描述:有兩個執行緒,主執行緒負責接收資料,並暫時儲存在記憶體中,當記憶體中數量達到一定資料量時,批量提交到oracle中;另一個執行緒作為提交執行緒,定時檢查一遍,不論記憶體中資料量達到多少,定期將資料提交到oracle中。兩個執行緒併發進行,第一個寫入記憶體或者資料庫
C# 線上程中訪問控制元件
C# 線上程中訪問控制元件,會丟擲異常 錯誤原因:執行緒間操作無效,從不是建立控制元件的執行緒訪問此控制元件。 解決方法:利用方法:Control.Invoke (Delegate) 詳情:https://msdn.microsoft.com/en-us/library
C# 跨執行緒呼叫TextBox方法淺析
首先來看下面程式碼: 主執行緒: delegate void SetTextCallback(string text); private void SetText(string text) { if (this.textBox1.InvokeRequir
C# 跨執行緒操作UI(介面)
C# winform程式裡經常會用到多執行緒,如果線上程的邏輯處理裡面有需要重新整理UI的,就需要交給委託來處理。 如下: 定義委託 private delegate void Sho
C#多執行緒訪問FileStream檔案
System.IO.FileStream fs = new System.IO.FileStream(fileName, System.IO.FileMode.Open) 這個方法開啟檔案的時候是以只
Winform控制元件多執行緒操作控制元件的解決方案
1)在要訪問的控制元件的那個窗體,定義公共屬於或公共方法,這樣可以實現間接的訪問 2)在主窗體,定義方法來包裝上面定義的另外一個窗體的方法,然後定義委託。 3)如果當執行緒,直接委託實現就可以,如果多執行緒,用invoke技術 在多執行緒程式設計中,我們經常要在工作執行緒中去
基礎1、非主執行緒修改控制元件文字
開發十年,就只剩下這套架構體系了! >>>