C# 子线程调用主线程窗体的解决方法

《C#编程之道》 之 如何跨线程调用Windows窗体控件 <br />推荐下载:《C#编程词典》体验版,免费享用最全的编程资源<br /> <br />    在开发具有线程的应用程序时,有时会通过子线程实现Windows窗体,以及控件的操作,比如:在对文件进行复制时,为了使用户可以更好的观察到文件的复制情况,可以在指定的Windows窗体上显示一个进度条,为了避免文件复制与进度条的同时操作所带来的机器假死状态,可以用子线程来完成文件复制与进度条跟踪操作,下面以简单的例子在子线程中操作窗体中的TextBox控件。代码如下:<br /><br />using Sys 阅读详情

由于Windows窗体控件本质上不是线程安全的。因此如果有两个或多个线程适度操作某一控件的状态(set
value),则可能会迫使该控件进入一种不一致的状态。还可能出现其他与线程相关的bug,包括争用和死锁的情况。所以VS2005这一改动便可以增强线程安全性。

我想大家更关心的是如何解决这个问题,如何才能操作其它线程中的控件而不引发异常,接下来我们就来探讨下这个问题:


第一种方法:


这种方法我没用过,因为大家推荐不要使用,所以我没去实验过,具体方法如下(摘自网上):

设置System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls
=
false;(winform.下)如果在你的程序初始化的时候设置了这个属性,而且在你的控件中使用的都是微软Framework类库中的控件的话,系统就不会再抛出你上面所说的这个错误了。当然这只是为了将VS2003的代码转换到VS2005下所使用的一种常见的方法。不建议采用;


第二种方法,也是我今天主要要讲的就是利用delegate和invoke这个方法:


思路:把想对另一线程中的控件实施的操作放到一个函数中,然后使用delegate代理那个函数,并且在那个函数中加入一个判断,用
InvokeRequired来判断调用这个函数的线程是否和控件线程在同一线程中,如果是则直接执行对控件的操作,否则利用控件的Invoke或
BeginInvoke方法来执行这个代理。


在继续讲解下去之前我们先来看一下这里提到的几个方法(如果对以下两个东东已经了解了就可以跳过)


首先是Invoke


Invoke的中文解释是唤醒,它有两种参数类型我们这里只讲一种即(Delegate, Object[])


Delegate就是前面提到的那个代理,而Object[]则是用来存放Delegate所代理函数的参数


MSDN上关于INVOKE方法有如下说明:在拥有控件的基础窗口句柄的线程上,用指定的参数列表执行指定委托。


用通俗的话讲就是利用控件的INVOKE方法,使该控件所在的线程执行这个代理,也就是执行我们想对控件进行的操作,相当于唤醒了这个操作;


其次是控件的InvokeRequired这个属性(个人翻译为’唤醒请求’):


MSDN上关于它的解释是获取一个值,该值指示调用方在对控件进行方法调用时是否必须调用Invoke方法,因为调用方位于创建控件所在的线程以外的线程中。


有通俗的话讲就是返回一个值,如果与控件属于同一个线程,则不需要进行唤醒的请求,也就是返回值为False,否则则需要进行唤醒的请求,返回为 true


总感觉MSDN上的翻译让人无法一看就明白,可能是自己智力不够吧~~


最后就是我们的具体程序了:
delegate void
aa(string s);//创建一个代理


private void pri(string
t)//这个就是我们的函数,我们把要对控件进行的操作放在这里


{


if
(!richTextBox1.InvokeRequired)//判断是否需要进行唤醒的请求,如果控件与主线程在一个线程内,可以写成
if(!InvokeRequired)


{



MessageBox.Show("同一线程内");



richTextBox1.Text =t;


}


else


{



MessageBox.Show("不是同一个线程");



aa a1 =new aa(pri);



Invoke(a1,new object []{t});//执行唤醒操作


}


}


private void Form1_Load(object
sender, System.EventArgse)


{


Thread
newthread = new Thread(new ThreadStart(ttread));



newthread.Start();


}


void ttread()


{


pri("sdfs");


}


执行结果先调出一个提示框显示“不是同一个线程”,然后跳出提示框显示“同一线程内”,然后richTextBox1中的text值为sdfs;这样便完成了对其它线程中的控件进行操作。

c#子线程如何读取及设置主线程ui的值 c#子线程如何读取及设置主线程ui的值,自己录的一个小视频,方便理解,比较菜鸟的方法,请勿喷! 立即下载

相关推荐

在多线程中调用winform窗体控件的实现方法

本文实例讲述了在C#中实现多线程中调用winform窗体控件的方法,对于C#程序设计的学习有着很好的借鉴参考价值。具体方法如下: 首先,由于Windows窗体控件本质上不是线程安全的。因此如果有两个或多个线程适度操作某一控件的状态(set value),则可能会迫使该控件进入一种不一致的状态。还可能出现其他与线程相关的 bug,包括争用和死锁的情况。于是在调试器中运行应用程序时,如果创建某控件的线程之外的其他线程试图调用该控件,则调试器会引发一个 InvalidOperationException 本文用一个很简单的示例来讲解这个问题(在窗体上放一个TextBox和一个Button,点击But

C#中常用的几种预定义委托

在System命名空间中,定义了一些常用的委托,如Action,Func,Predicate,Comparison,Converter, EventHandler等。需要注意的是,参数带有in的,表示逆变;参数带有out的,表示协变。 Action<in T> 或Action<in T1,...,in Tn> 即 delegate void System.Action<in T1,...,in Tn>(T1 arg1,...,Tn argn) // F...

就在昨天之技术点滴 519

claude使用教程

提供了三种模型:claude,codex, gemini,三种模型都共用同一个apikey, 有开发需求使用claude效果较好,知识问答等场景gemini效果会更好些,本文只提供了claude的安装方式,剩下两种按需按照以下参考链接安装下即可,安装有问题参考文档:https://www.aicodemirror.com/dashboard/official-installation/macos-linux (不需要挂梯子,自己手机号注册就好)

lichao19871216的博客 3459

C#线程之间访问变量

C#线程之间访问变量 无聊的时候,想着好久都没有接触C#程序了,就随便写了写,想着计算一定时间内鼠标点击次数,测下手速/(ㄒoㄒ)/~~ 点击Click后,每点一次,右侧数字就+1,Time处开始计时 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; us...

kaikai45的博客 3979

【实战分享】低成本K型热电偶测温方案:单运放放大与STM32 ADC采集优化

本文详细介绍了低成本K型热电偶测温方案,通过单运放放大与STM32 ADC采集优化,解决了信号微弱、负电压处理和冷端补偿等核心挑战。方案采用LMV358运放和T型网络降低噪声,结合STM32的ADC校准和软件滤波,实现±0.5℃精度,物料成本控制在15元以内,适用于工业测温场景。

weixin_30839881的博客 165

SPM12最新安装教程:Matlab2021a用户必看的路径配置技巧

本文为Matlab2021a用户提供SPM12的深度安装与路径配置指南。针对新版Matlab的路径管理变化,详细解析了传统方法失效的原因,并推荐通过创建startup.m文件实现SPM12路径的永久化、自动化配置,确保神经影像分析环境的稳定与高效。

weixin_29061509的博客 314

C# 子线程调用主线程窗体的解决方法(转自他人,留着自己日后查阅,(*^__^*) 嘻嘻……)...

由于Windows窗体控件本质上不是线程安全的。因此如果有两个或多个线程适度操作某一控件的状态(set value),则可能会迫使该控件进入一种不一致的状态。还可能出现其他与线程相关的bug,包括争用和死锁的情况。所以VS2005这一改动便可以增强线程安全性。 我想大家更关心的是如何解决这个问题,如何才能操作其它线程中的控件而不引发异常,接下来我们就来探讨下这个问题: 第一种方法: ...

weixin_33690963的博客 307

深入解析西门子S7通信协议:从抓包到实战应用

本文深入解析西门子S7通信协议,从环境搭建、抓包分析到实战应用,提供了一套完整的协议分析方法。通过Wireshark工具进行抓包分析,详细拆解了S7协议各层结构,并结合真实案例,展示了如何利用抓包技术解决通信故障、优化性能及进行安全审计,是掌握工业通信底层原理的实用指南。

weixin_29224529的博客 281

浅述WinForm多线程编程与Control.Invoke的应用

VS2008、C#3.0 在WinForm开发中,我们通常不希望当窗体上点了某个按钮执行某个业务的时候,窗体就被卡死了,直到该业务执行完毕后才缓过来。一个最直接的方法便是使用多线程。多线程编程的方式在WinForm开发中必不可少。 本文介绍在WinForm开发中如何使用多线程,以及在线程中如何通过Control.Invoke方法返回窗体主线程执行相关操作。 -. WinForm多线程编程...

weixin_30781775的博客 451

使用MLP解决OCR问题(OpenCV)(下)

分类模型:        分类模型涉及的一个比较关键的问题就是输出的10维向量是如何与具体的类别挂钩的。实际上:10维向量的每一位都代表一类,在对于训练集的表达中,如果输入数据是0,则10维向量的第一位赋值为1,其余均为0。即0对应[1,0,0,0,0,0,0,0,0,0]。MLP模型训练完成后,就需要对用户输入的数据所属类别进行判定。这时得到的输出数据基本不可能是正好的所属类为1,其他位置为0

qq_18515405的专栏 1906

ARM CoreLink 系列 5.1.1 -- CI-700 System Address Map 】

所有的CHI 命令都包含一个 Source ID 和 Target ID, 其中 Source ID 可以来自于 RN Node, Target ID 可以来自于HN node或者其他 SN node. 其中 Target ID 是通过 SAM解析传入的地址得到的。对于 CI-700中的所有 RN Node 中的 SAM 多会进行配置,因为RN Node 访问的是整个地址空间,不同的地址空间会有不同的属性(I/O, DRAM),所以会对RN SAM 配置多个不同属性的区域。

CodingCos的博客 770

WinForm 在子线程中打开一个新窗体

项目中有个动作:打开一个窗体展示 FormToast toast = new FormToast(); toast.lblMsg.Text = str; toast.Show(); 大多数情况,直接在界面上(主线程)点击按钮的时候展示,没问题。 有些特殊情况,是在新开的子线程中要展示窗体,用上面的办法就不行了,窗体展示不全,像被挡住或卡住。 网上找到了解决的办法:https://stac...

小鹰信息技术服务部 4958

【华为OD机试真题E卷】300、 出租车计费 、靠谱的车 | 机试真题+思路参考+代码分析(C++、Java、Py、C语言、JS)

题目描述 >程序员小明打了一辆出租车去上班,出于职业敏感,他注意到这辆出租车的计费表有点问题,总是偏大,出租车司机解释说他不喜欢数字4,所以改装了计费表,任何数字位置遇到数字4就直接跳过,其余功能都正常 >  比如: 1、23再多一块钱就变为25; 2、39再多一块钱变为50; 3、399再多一块钱变为500; >  小明识破了司机的伎俩,准备利用自己的学识打败司机的阴谋,给出计费表的表面读数,返回实际产生的费用

KJ.JK 4万+

C# 子线程如何操作主线程窗体上的控件

在C#中,直接在子线程中对窗体上的控件操作是会出现异常,这是由于子线程和运行窗体的线程是不同的空间,因此想要在子线程来操作窗体上的控件,是不可能简单的通过控件对象名来操作,但不是说不能进行操作,微软提供了Invoke的方法,其作用就是让子线程告诉窗体线程来完成相应的控件操作。 要实现该功能,基本思路如下: (1)、把想对另一线程中的控件实施的操作放到一个函数中,(2)、然后使用delegate代理那个函数,(3)、并且在那个函数中加入一个判断,用 InvokeReq...

ba_wang_mao的专栏 2414

【VTKExamples::PolyData】第十六期 GradientFilter

本文分享VTK样例GradientFilter,并解析接口vtkGradientFilter & vtkAssignAttribute,希望对各位小伙伴有所帮助!

qq_40041064的博客 318

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C#子线程执行完后,调用主线程的方法

private delegate void CheckVersionNumber_CallBack(string str);//定义一个为委托 用于 检测版本//检测版本private void m_CheckVersionNumber(string strVersionNumber) { try { ...

weixin_30824479的博客 1857

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

C#主线程等待子线程运行结束

佐左佑右原文C#主线程等待子线程运行结束   由于主程序中调用matlab的dll文件进行计算要用较长的时间,主界面会有很长时间的卡顿,造成的用户感受十分不好,因此我想在调用时,将调用放入子线程中,然后在主线程中弹出一个提示框,显示数据正在加载,等子线程运行结束后,主线程继续工作。 使用的是http://hi.baidu.com/okt...

weixin_34163553的博客 5668

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C# 子线程与主线程通讯方法一

最近在项目中要用到子线程运行结束向主线程通知的需求,利用线程上下文来实现线程之间的同步。 子线程结束后调用同步函数,向主线程发送时间字符串,改变主窗体的label标签 label标签改变事件触发处理函数,进行显示; 代码如下: 主窗体: public static MainForm comMainForm; //其他类可以直接调用此窗体的控件 public MainForm()...

weixin_30608503的博客 535

C#主线程与子线程退出顺序逻辑

不同方式退出主线程的区别 (1)正常窗口关闭时相当于调用Form.Close(),先执行OnClosing,再执行FormClosing事件,再执行OnFormClosed,再执行FormClosed事件,再释放资源,再执行Application_ThreadExit事件,最后主线程完全退出Application.Run(),后台子线程在主线程退出后退出 (2)调用Application.Exit()方法,将不执行OnClosing方法,直接从FormClosing事件的顺序开始执行,因此不能在OnClos

stephon_100的博客 1367

关于C#关闭窗体后,依旧有后台进程在运行的解决方法

话不多说直接粘贴链接,这个博主写的非常详细 http://www.cnblogs.com/HappyEDay/p/5713707.html 这里粘贴原文权当备份了。 C#中WinForm程序退出方法技巧总结  一、关闭窗体  在c#中退出WinForm程序包括有很多方法,如:this.Close(); Application.Exit();Application.Exit

mainbyz的博客 2万+
上一篇: 将应用程序加到分享列表及如何使用
下一篇: javah命令提示无法访问android.app.activity类文件
woolnil
博客等级 码龄22年 39粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值