利用网站建设平台,关键词自动优化工具,做网站包括服务器么,网站没有流量怎么办起因
很多C#初学者#xff0c;都遇到过这样的问题——线程间操作无效#xff0c;从不是创建控件的线程访问它。
今天就这个问题#xff0c;展开分析。 溯源
先说下这个问题产生的根源。
大家都知道#xff0c;程序运行起来之后#xff0c;首先会有一个主线程#xff…起因
很多C#初学者都遇到过这样的问题——线程间操作无效从不是创建控件的线程访问它。
今天就这个问题展开分析。 溯源
先说下这个问题产生的根源。
大家都知道程序运行起来之后首先会有一个主线程主线程用于处理控件生成、界面渲染、事件响应、逻辑处理等操作因此我们可以理解为窗体里的控件是属于主线程的。
我们也知道多线程如果我们想实现与主线程同时执行另一件事一般会去使用多线程。
因此多线程从某种意义上来说它和主线程都属于“线程”这个家族他们的身份是“平等”的就像你和你同事之间的关系一样。
那么试想一下如果你同事有一天想从你手上把你的PLC或者上位机项目程序拿过去你愿不愿意 所以如果在多线程里操作主线程的控件你觉得主线程会不会答应当然不会主线程不答应的最直接表现就是它会直接给一个报错权当警告如下图所示 解决
那么如何解决呢
你的同事如果非要拿到你的程序他会想硬的不行就来软的。
所以他会找到你们共同的领导跟你们领导这样说“我手头上的这个100万的项目能给公司带来50%的利润现在需要用到他之前那个项目里的一个小知识需要他把程序给我参考一下”。
在公司利益面前你觉得你的领导会怎么办
于是领导和你“商量”了一下毋庸置疑你妥协了。
你的同事使用的招数叫做——委托。
那么现在回到之前的问题上来现在多线程要操作主线程的控件是不是也可以使用委托来实现
前世
委托定义委托Delegate 是对某个方法的引用的一种引用类型变量。 如果这句话看不懂那就别看了跟着我动手做。
1、声明委托
委托声明需要根据执行的方法来定严格来说就是根据执行方法的返回值和参数我们只是给窗体的Text设置一个固定值而已因此我们的参数是空返回值也为空。
声明委托如下 2、创建委托对象
委托严格来说是一种类型就像类一样如果想要调用某个类必须要创建一个该类的对象所以我们要创建一个委托对象 3、创建委托方法
委托对象也只是一个对象而已就像领导一样领导是不可能干活的最终干活还得靠底下的兵来干所以我们还得招人去干活。
招人干活就是委托方法我们现在这个活很简单所以我们的方法也很简单。 4、委托绑定
我们招到了一个“兵”现在也有一个部门领导怎么把他们联系起来呢
很简单让人事把这个兵分到这个部门就行了这个分配的过程就是委托绑定代码如下 5、委托调用
万事俱备只欠东风终于干活了。
作为公司的老板一般是不可能跟员工打交道的他会把任务分配给部门领导部门领导会把活再分配下去所以我们委托调用也是调用委托对象。 以上五步就是委托的实现过程。
然而我们运行之后还是会报错。 没有那么简单的事
因为想要在多线程里操作主线程的控件你还得经过控件的同意怎么经过控件同意呢
控件的父类Control提供了一个这样的方法 意思就是说想要操作控件必须要通过Invoke方法来实现Invoke方法里参数是一个委托于是我们只能灰溜溜地这样写 果然按照规矩来就能达到效果 今生
微软从某个版本开始出来了Action和Lamda表达式Action是系统委托也就是说不需要我们手动创建委托了它有个兄弟叫FuncAction没有返回值最多可以有16个参数Func必须要有返回值最多可以有16个参数最后一个参数表示返回值。
于是我们开始简化
第一步简化用Action作为委托来创建 第二步简化委托对象只用一次所以可以直接放到参数里 第三步简化用Lamda表达式代替方法 总结
我们所以常写的那行代码其实只是一种简写方式而已委托的五步法不管怎么简化怎么优化其实本质还是一样都离开不了这五个步骤。
这就是经典。
都看到这里了是不是要点个赞呢