日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

c#中跨线程调用windows窗体控件 .我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传统方法来做这个问题,下面我将详细的介绍。...

發(fā)布時間:2024/1/17 C# 48 豆豆

首先來看傳統(tǒng)方法:

public partial class Form1 : Form{public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Thread thread = new Thread(ThreadFuntion); thread.IsBackground = true; thread.Start(); } private void ThreadFuntion() { while (true) { this.textBox1.Text = DateTime.Now.ToString(); Thread.Sleep(1000); } } }

運行這段代碼,我們會看到系統(tǒng)拋出一個異常:

Cross-thread operation not valid:Control 'textBox1' accessed from a thread other than the thread it was created on .

這是因為.net 2.0以后加強了安全機制,不允許在winform中直接跨線程訪問控件的屬性。那么怎么解決這個問題呢,下面提供幾種方案。 第一種方案,我們在Form1_Load()方法中加一句代碼:

private void Form1_Load(object sender, EventArgs e){Control.CheckForIllegalCrossThreadCalls = false; Thread thread = new Thread(ThreadFuntion); thread.IsBackground = true; thread.Start(); }

????? 加入這句代碼以后發(fā)現(xiàn)程序可以正常運行了。這句代碼就是說在這個類中我們不檢查跨線程的調(diào)用是否合法(如果沒有加這句話運行也沒有異常,那么說明系統(tǒng)以及默認的采用了不檢查的方式)。然而,這種方法不可取。我們查看CheckForIllegalCrossThreadCalls 這個屬性的定義,就會發(fā)現(xiàn)它是一個static的,也就是說無論我們在項目的什么地方修改了這個值,他就會在全局起作用。而且像這種跨線程訪問是否存在異常,我們通常都會去檢查。如果項目中其他人修改了這個屬性,那么我們的方案就失敗了,我們要采取另外的方案。 ????? 下面來看第二種方案,就是使用delegate和invoke來從其他線程中控制控件信息。網(wǎng)上有很多人寫了這種控制方式,然而我看了很多這種帖子,表明上看來是沒有什么問題的,但是實際上并沒有解決這個問題,首先來看網(wǎng)絡(luò)上的那種不完善的方式:

public partial class Form1 : Form{private delegate void FlushClient();//代理 public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Thread thread = new Thread(CrossThreadFlush); thread.IsBackground=true; thread.Start(); } private void CrossThreadFlush() { //將代理綁定到方法 FlushClient fc = new FlushClient(ThreadFuntion); this.BeginInvoke(fc);//調(diào)用代理 } private void ThreadFuntion() { while (true) { this.textBox1.Text = DateTime.Now.ToString(); Thread.Sleep(1000); } } }

使用這種方式我們可以看到跨線程訪問的異常沒有了。但是新問題出現(xiàn)了,界面沒有響應(yīng)了。為什么會出現(xiàn)這個問題,我們只是讓新開的線程無限循環(huán)刷新,理論上應(yīng)該不會對主線程產(chǎn)生影響的。其實不然,這種方式其實相當于把這個新開的線程“注入”到了主控制線程中,它取得了主線程的控制。只要這個線程不返回,那么主線程將永遠都無法響應(yīng)。就算新開的線程中不使用無限循環(huán),使可以返回了。這種方式的使用多線程也失去了它本來的意義。 現(xiàn)在來讓我們看看推薦的解決方案

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 WindowsFormsApplication4 { public partial class Form1 : Form { private delegate void FlushClient(); //代理 Thread thread = null; int counter = 0; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { this.listBox1.Items.Clear(); button1.Enabled = false; thread = new Thread(CrossThreadFlush); thread.IsBackground = true; thread.Start(); } private void button2_Click(object sender, EventArgs e) { thread.Suspend(); button1.Enabled = true; } private void CrossThreadFlush() { while (true) { //將sleep和無限循環(huán)放在等待異步的外面 Thread.Sleep(1000); ThreadFunction(); } } private void ThreadFunction() { if (this.listBox1.InvokeRequired)//等待異步 { FlushClient fc = new FlushClient(ThreadFunction); this.Invoke(fc); //通過代理調(diào)用刷新方法 } else { counter += 1; this.label1.Text = counter.ToString(); this.listBox1.Items.Add(System.DateTime.Now.ToString()); } } } }

運行上述代碼,我們可以看到問題已經(jīng)被解決了,通過等待異步,我們就不會總是持有主線程的控制,這樣就可以在不發(fā)生跨線程調(diào)用異常的情況下完成多線程對winform多線程控件的控制了。

轉(zhuǎn)載于:https://www.cnblogs.com/275147378abc/p/4615262.html

總結(jié)

以上是生活随笔為你收集整理的c#中跨线程调用windows窗体控件 .我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传统方法来做这个问题,下面我将详细的介绍。...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲激情午夜 | 亚洲吧| 欧美日本二区 | 欧产日产国产精品98 | 黄色国产在线视频 | 韩产日产国产欧产 | 日本在线视频免费观看 | 国产精品国产三级国产专区53 | 久久情趣视频 | 国产小视频免费在线观看 | 巨胸爆乳美女露双奶头挤奶 | 欧美天天搞 | 久久精品123 | 亚洲天堂一区在线观看 | 国产成人精品av在线观 | 久久视奸| 少妇喷白浆 | 香蕉视频久久久 | 亚洲另类色图 | 成人免费在线小视频 | 国产乱free国语对白 | 久草福利视频 | 日韩在线欧美在线 | 欧美最猛性xxxxx(亚洲精品) | 色吧在线观看 | 欧美理伦片在线播放 | 黄色一级免费网站 | 色原网| 亚洲免费视频一区二区三区 | 欧美成人免费观看视频 | 国产美女视频免费观看下载软件 | 亚洲一区二区三区影视 | 日韩久久久久 | 无套内谢少妇毛片 | 男女日批视频 | 天天久久综合网 | 好吊妞视频在线 | 国产女主播喷水视频在线观看 | 午夜伦伦电影理论片费看 | 国产乱大交 | 午夜成人免费电影 | 免费看日韩 | 激情五月综合 | 亚洲成人二区 | 国产午夜三级一区二区三 | 国产成人综合自拍 | 国产福利不卡视频 | 人人插人人射 | 日产电影一区二区三区 | 2019年中文字幕 | 一本一本久久a久久精品综合麻豆 | 69视频国产 | 亚洲理论在线观看 | 有声小说 成人专区 | 欧美黄色一级大片 | 青青操在线 | 天天色棕合合合合合合合 | 夜夜操国产 | 99久久精品免费视频 | 一级片在线观看免费 | 香蕉视频网址 | 中文字幕第七页 | 亚洲最大综合网 | 亚洲精品成人在线 | 精品久久久久久久久久久久久久 | 搞黄网站在线观看 | 色婷婷在线影院 | 末路1997全集免费观看完整版 | 国产精品成熟老女人 | 在线中文字幕第一页 | 欧美一区二区三区四区在线观看 | a级片免费看 | 黄色一级视频网站 | 一区二区久久 | 2020国产在线| 99资源站 | 国产一二三级 | 精品国产乱码久久久久久闺蜜 | 青青草国产在线视频 | 国产喷水视频 | 丝袜人妻一区二区三区 | 性歌舞团一区二区三区视频 | 日韩av一级| 日韩有码中文字幕在线 | 亲子乱aⅴ一区二区三区 | 中文字幕免费视频 | 一区二区三区国产精品 | 自拍偷拍亚洲一区 | 快射视频在线观看 | 久久久久久国产精品三区 | 国产成人手机视频 | 91极品视频 | 国产免费av在线 | 国产精品入口麻豆 | 亚洲人一区二区三区 | 无人在线观看高清视频 单曲 | 日韩精品中文字幕在线观看 | 亚洲精品国产片 | 神马三级我不卡 |