1. 程式人生 > >C# 跨執行緒訪問控制元件

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、非主執行修改控制元件文字

開發十年,就只剩下這套架構體系了! >>>