1. 程式人生 > >C# 線上程中訪問控制元件

C# 線上程中訪問控制元件

C#  線上程中訪問控制元件,會丟擲異常
錯誤原因:執行緒間操作無效,從不是建立控制元件的執行緒訪問此控制元件。


解決方法:
利用方法:Control.Invoke (Delegate) 
詳情:https://msdn.microsoft.com/en-us/library/zyzhdc6b(v=vs.110).aspx


思路:
1、定義一個委託型別
2、宣告一個此委託型別的 變數
3、在委託呼叫的方法中實現  訪問控制元件


如下:
1、public void delegate SetControl();
2、public SetControl setControlDelegate;
3、setControlDelegate = new SetControl(SetControlMethod);
4、線上程的回撥函式中,呼叫控制元件的invoke方法。
注:SetControlMethod 方法需要自己定義,裡面執行對控制元件的操作。
例:
向Form中新增listbox,button控制元件


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


        public delegate void SetControl();
        public SetControl setControlDelegate;


        public void SetControlMethod()
        {
            for (int i = 0; i < 6; i++)
            {
                listBox1.Items.Add("items " + i.ToString() + "= ");
            }
        }


        private void Form1_Load(object sender, EventArgs e)
        {
            setControlDelegate = new SetControl(SetControlMethod);
        }


        private void button1_Click(object sender, EventArgs e)
        {
            Thread myThread = new Thread(ThreadFunction);
            myThread.Start();
        }


        public void ThreadFunction()
        {
            listBox1.Invoke(setControlDelegate);
        }
    }
}

相關推薦

C# 線上訪問控制元件

C#  線上程中訪問控制元件,會丟擲異常 錯誤原因:執行緒間操作無效,從不是建立控制元件的執行緒訪問此控制元件。 解決方法:利用方法:Control.Invoke (Delegate)  詳情:https://msdn.microsoft.com/en-us/library

C#Form.SplitContainer清除控制元件textbox值(窗體.容器.控制元件

文章目錄 問題背景 問題程式碼 問題解決 正確清除程式碼 問題延申 問題背景 早上在完善不確定度計算器時,想要清空實驗資料輸入時所有textbox控制元件值。 問題程式碼

基於C#的WinFormDataGridView控制元件操作彙總

基於C#的WinForm中DataGridView控制元件操作彙總 一、單元格內容的操作  *****// 取得當前單元格內容         Console.WriteLine(DataGridView1.CurrentCell.Value); // 取

C# 跨執行緒訪問控制元件

因為C#安全機制的問題,不是本執行緒建立的控制元件,是不能直接訪問的。以下提供了兩種解決辦法:一、讓程式不檢查跨執行緒呼叫,加入一行程式碼就可以了,但這樣背離了C#安全機制的初衷;二、建立委託,利用C#的Invoke方法來執行跨執行緒呼叫。using System; usin

C# 線上顯示一個新窗體

在多執行緒中,一個執行緒結束時需要顯示一些結果資訊給使用者,我採用新的窗體來顯示。但簡單的線上程體裡面如下寫private void ThreadFunc() { MsgForm msg = new MsgForm(); msg.Show(); } pri

C#如何線上修改我的窗體控制元件的text文字

以下辦法實驗成功: 執行緒不能操作窗體控制元件,會引發異常,建議使用委託進行窗體控制元件的操作,包括 改text. 1、定義委託 delegate void SetTextCallback(string text); 2、實現委託 priv

C# winform 自定義函式找不到Form控制元件和定義的全域性變數

今天碰到一個比較狗血的問題,想了很多辦法,最後發現,原來如此的坑。 在新建一個form頁面後,我們在程式碼頁面寫程式碼,往往會寫自定義的方法,一般情況下,在自定義的方法中是可以找到form頁面中的控制元件和自定義的全域性變數, 但是如果我們在自定義的方法前面加了static,那麼坑就出來啦,從此這個方法好

c#chart控制元件如何新增輔助的警示線啊(參考線)

public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String[] st = sc.nextLine().split("

C#將使用者自定義控制元件新增到工具箱

組裝使用者自定義的窗體 為了複用和便於維護,在C#中如何用已有窗體組裝自己的窗體,並且可以在以後需要的時候隨意拖拽使用? 在專案或專案中的某個資料夾上右鍵——新增——使用者控制元件 然後就可以編輯了。 將使用者自定義控制元件新增到工具箱中, 這樣在以後的專案中

c# winform程式在WebBrowser控制元件執行javascript指令碼

來自:http://outofmemory.cn/code-snippet/1706/c-winform-program-WebBrowser-control-execution-javascript-script winform的WebBrowser控制元件,可以方便的載

C# WinFormDateTimePicker控制元件的Text屬性和Value屬性

在WinForm中經常會用到DateTimePicker這個控制元件,用這個控制元件獲取時間會使用到Text屬性或者Value屬性。 關於這兩個屬性,還是存在著一些的不同,在這裡簡單的測試和總結一下。

C#使控制元件隨著窗體一起變化(常見困難以及修正)

1.使用一些佈局面板,比如FlowLayoutPanel,TabLayOutPanel之類,但是缺點就是樣式太死了。所以本人不採用。 2.採用Dock和Anchor屬性。這類雖然滑鼠點幾下在屬性欄設定一下就好,但是缺乏靈活性。只有上下左右中間幾種選擇。 3.採用Form_Resize()。這

關於WMobileWebBrowser控制元件存在的問題(C#)

我所做的工程需要用到WebBrowser這個控制元件,不過在使用的過程中發現了它有點問題,工程是這樣的:    按下Form1中的FrmWB1按鈕,開啟FrmWB1,其中FrmWB1中是有WebBrowser控制元件. 問題1:當我關閉了窗體FrmWB1時, 再按下Form

C#ZedGraph控制元件的下載和使用

ZedGraph控制元件的下載和使用 2.   然後在工具箱中點選右鍵,Choose Items,如下圖所示:   3.   然後瀏覽找到ZedGraph.dll並點選“開啟”按鈕ZedGraph控制元件的下載和使用 4. 將ZedGraphControl、ZedG

.NETWebBrowser控制元件內部頁面的JS程式碼與外部C#程式碼的相互呼叫

場景1:C#程式呼叫JS函式重新整理網頁,輸出再見兩字;測試目標:C#呼叫JS函式 場景2:C#程式呼叫JS函式重新整理網頁,輸出文字為使用者輸入的文字;測試目標:C#呼叫帶引數的JS函式 場景3:C#程式呼叫JS函式獲取今日的年月日資訊(yyyy-MM

C#datetimepicker控制元件

找了半天終於知道datetimepicker控制元件如何顯示時間了(之前只能顯示日期) 要把屬性改一下:   CustomFormat設成yyyy年MM月dd日 HH:mm:ss   Format設成Custom 還要注意下ShowUpDown屬性。 CustomFormat 屬性的可選值: 格式字串  

C#ListBox控制元件設定Item字型並居中顯示

最近專案中又需要客製化一些控制元件,draw來draw去真的好煩,其中有ListBox客製化並居中顯示字型,特記錄下供各位以備不時,比較簡單,禁止拍磚哈~~~ 首先將Listbox的DrawMode屬性設定為DrawMode.OwnerDrawVariable 載入事件D

Unity3d C 錯誤提示 禁止線上進行遊戲物件比較

                今天剛剛寫完非同步Socket客戶端的資料收發,在進行測試的時候,Unity報出錯誤: &nb

C#combobox 控制元件屬性、事件、方法

一 、combobox 屬性、事件、方法公共屬性 名稱 說明 AccessibilityObject 獲取分配給該控制元件的 AccessibleObject。AccessibleDefaultActionDescription 獲取或設定控制元件的預設操作說明,供輔助功能客戶端應用程式使用。Acces

Unity3d(C#)錯誤提示:禁止線上進行遊戲物件比較!

今天剛剛寫完非同步Socket客戶端的資料收發,在進行測試的時候,Unity報出錯誤: CompareBaseObjectsInternal can only be called from the main thread. 詳情如下: ERROR : CompareB