多線程調用同一個對象的方法,C# 中禁止跨線程訪問解決-- MethodInvoker的理解

 2023-10-24 阅读 521 评论 0

摘要:以下引用自:???c#使用MethodInvoker解決跨線程訪問控件 net?原則上禁止跨線程訪問控件,因為這樣可能造成錯誤的發生,有一種方法是禁止編譯器對跨線程訪問作檢查,Control.CheckForIllegalCrossThreadCalls?=?false;可以實現訪問,但是出不出錯不

以下引用自:???c#使用MethodInvoker解決跨線程訪問控件

net?原則上禁止跨線程訪問控件,因為這樣可能造成錯誤的發生,有一種方法是禁止編譯器對跨線程訪問作檢查,Control.CheckForIllegalCrossThreadCalls?=?false;可以實現訪問,但是出不出錯不敢保證C#跨線程訪問控件運行時錯誤。

使用MethodInvoker即可解決

?

多線程調用同一個對象的方法。看看系統定義, 與event 的區別

public delegate void MethodInvoker();

public delegate void EventHandler(object sender, EventArgs e);

簡單來說 :

MethodInvoker 是不帶參數的委托。
EventHandler 是可帶參數的委托

?

多個線程并發訪問一個方法?我是這樣理解的, 開啟新線程 threadRun,?? 在新線程中使用MethodInvoker 委托執行 run()方法,?這個時候 run() 方法其實是在主線程中執行的, 這樣就避免了 跨線程訪問控件, 以下是我的測試代碼:

private void button1_Click(object sender, EventArgs e){Thread.CurrentThread.Name = "MainThread"; //主線程命名為 MainThreadThread td = new Thread(threadRun);td.Name = "ChildThread"; //子線程命名為 ChildThreadtd.Start();}private void ChangeText(){this.textBox1.Text = Thread.CurrentThread.Name; //TextBox1內容被修改的線程的名字}private void threadRun(){MessageBox.Show(Thread.CurrentThread.Name); //彈出對話框, 當前運行線程的名字MethodInvoker In = new MethodInvoker(ChangeText);this.BeginInvoke(In);


運行后, 點擊 Button 首先彈出對話框 ChildThread, 然后 TextBox1 改為 MainThread

?

然后我的牛角勁又來了, ChangeText 被 MethodInvoker 插入到主線程中運行,?那么 ChangeText 應該是在 button1_Click 完全結束后才運行吧, 測試代碼

private void button1_Click(object sender, EventArgs e){Thread.CurrentThread.Name = "MainThread"; //主線程命名為 MainThreadThread td = new Thread(threadRun);td.Name = "ChildThread"; //子線程命名為 ChildThreadtd.Start();int k=0; //讓主線程全速運行一段時間for (long i = 0; i < 1000000000; i++){if (k > 10000) k = 0;k = k+5;}MessageBox.Show("MainThread全速運算剛剛結束了");}private void ChangeText(){MessageBox.Show(Thread.CurrentThread.Name); //彈出執行ChangeText的線程的名字}private void threadRun(){MessageBox.Show(Thread.CurrentThread.Name); //彈出對話框, 當前運行線程的名字MethodInvoker In = new MethodInvoker(ChangeText);this.BeginInvoke(In);}

抄自博客https://blog.csdn.net/zhouandke/article/details/46821309

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

原文链接:https://808629.com/165352.html

发表评论:

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

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息