.NET并行计算和并发3-Invoke
Control.Invoke 方法 (Delegate)
在拥有此控件的基础窗口句柄的线程上执行指定的委托。
Invoke方法搜索沿控件的父级链,直到它找到的控件或窗口具有一个窗口句柄;
如果尚不存在当前控件的基础窗口句柄,或者找不到任何合适的句柄,Invoke方法
将会引发异常。
例子
public class MyFormControl : Form { public delegate void AddListItem(); public AddListItem myDelegate; private Thread myThread; private ListBox myListBox; public MyFormControl() { var myButton = new Button(); myListBox = new ListBox(); myButton.Location = new Point(72, 160); myButton.Size = new Size(152, 32); myButton.TabIndex = 1; myButton.Text = "Add items in list box"; myButton.Click += new EventHandler(Button_Click); myListBox.Location = new Point(48, 32); myListBox.Name = "myListBox"; myListBox.Size = new Size(200, 95); myListBox.TabIndex = 2; ClientSize = new Size(292, 273); Controls.AddRange(new Control[] { myListBox, myButton }); Text = " 'Control_Invoke' example"; myDelegate = new AddListItem(AddListItemMethod); } public void AddListItemMethod() { String myItem; for (int i = 1; i < 6; i++) { myItem = "MyListItem" + i.ToString(); myListBox.Items.Add(myItem); myListBox.Update(); Thread.Sleep(3000); } } private void Button_Click(object sender, EventArgs e) { myThread = new Thread(new ThreadStart(ThreadFunctionRight)); myThread.Start(); } }
关键
private void ThreadFunctionWrong() { //if direct call myDelegate(), it would throw an exception myDelegate(); } private void ThreadFunctionRight() { //right way: must run at thead that creates myListBox control. // Execute the specified delegate on the thread that owns // 'myListBox' control's underlying window handle. this.Invoke(this.myDelegate); }
.NET并行计算和并发3-Invoke的更多相关文章
- .NET并行计算和并发3.2-多线程调用Invoke
以下这个例子是用一个后台线程执行计算逻辑,这样不影响前台界面操作,也就是说 可以在前台UI界面执行其他操作. 重点是新线程中,调用了一个委托方法,这个方法是需要填充数据到前台控件,因为 前台控件是在原 ...
- .NET并行计算和并发2-Foreground and Background Threads
后台线程不会使托管执行环境处于运行状态,除此之外,后台线程与前台线程是一样的. 一旦所有前台线程在托管进程(其中 .exe 文件是托管程序集)中被停止,系统将停止所有后台线程并关闭.
- .NET并行计算和并发11:并发接口 IProducerConsumerCollection
using System; using System.Collections; using System.Collections.Generic; using System.Collections.C ...
- .NET 并行计算和并发10-lock锁
class Program { private static List<int> intlist; static void Main(string[] args) { intlist = ...
- .NET并行计算和并发:Task
任务不是线程. 任务运行的时候需要使用线程,任务并没有取代线程.
- .NET并行计算和并发8:硬件支持
共享内存多核系统,分布式内存系统 区别 分布式内存系统主要通过Message passing interface在各个微处理器之间通信,但是MPI共享内存多核系统是没有必要的,会造成额外的开销. 分布 ...
- .NET并行计算和并发8-QueueUserWorkItem异步
QueueUserWorkItem方法将非常简单的任务排入队列 下面这个简单的代码,涉及到资源竞争问题,如果主线程先争取到资源,如果没有等待 一段时间,那么QueueUserWorkItem申请的 ...
- .NET并行计算和并发7-Task异步
使用任务并行库执行异步任务 下面的示例演示如何通过调用 TaskFactory.StartNew 方法来创建并使用 Task 对象. using System; using System.Thread ...
- .NET并行计算和并发6-获取线程池的最大可用线程数
using System; using System.IO; using System.Security.Permissions; using System.Threading; class Test ...
随机推荐
- JS实现全选、不选、反选
思路:1.获取元素.2.用for循环历遍数组,把checkbox的checked设置为true即实现全选,把checkbox的checked设置为false即实现不选.3.通过if判断,如果check ...
- Vue中应用CORS实现AJAX跨域,及它在 form data 和 request payload 的小坑处理
基本概念部分(一):理解CORS 说道Vue的跨域AJAX,我想先梳理一遍CORS跨域,"跨域资源共享"(Cross-origin resource sharing),它是一个W3 ...
- python迭代器生成器(三)
扩展的列表解析语法 今天接着昨天的继续写. 列表解析可以变得更加复杂---例如,它可以包含嵌套的循环,也可能被编写为一系列的for子句.(这里只是简单介绍一下,以后再说这个语法的问题) 例如:构建一个 ...
- Linux的同步访问技术
1.中断屏蔽: 单CPU范围内避免竞态的一种简单方法:在进入临界区之前屏蔽系统的中断.中断屏蔽将使得中断与进程之间的并发不再发生,而且Linux内核的进程调度等操作都依赖中断来实现,内核抢占式进程之间 ...
- java在的数据类型
java数据类型的划分 程序的本质=数据的处理: 数据库的本质=数据的存储. java之中数据类型一共分为两大类. ·基本数据类型: 数值型: 整型:byte,short,int,long 默认值都是 ...
- [图形学] 习题8.12 NLN二维线段裁剪算法实现
Nicholl-Lee-Nicholl二维线段裁剪算法相对于Cohen-Sutherland和Liang-Barsky算法来说,在求交点之前进行了线段端点相对于几个区域的判断,可以确切的知道要求交点的 ...
- 简单的使用Seajs
什么是Seajs Seajs是一个加载器 http://yslove.net/seajs/ 遵循 CMD 规范模块化开发,依赖的自动加载.配置的简洁清晰. 兼容性 Chrome 3+ Firefox ...
- Java并发编程深入学习
上周的面试中,被问及了几个并发开发的问题,自己回答的都不是很系统和全面,可以说是"头皮发麻",哈哈.因此果断购入<Java并发编程的艺术>一书,该书内容主要是对ifev ...
- Java编程思想总结笔记Chapter 2
本章介绍Java程序的基本组成部分,体会到Java中几乎一切都是对象. 第二章 一切都是对象 目录: 2.1 用引用操纵对象 2.2 必须由你创建所有对象 2.3 永远不需要销毁对象 2.4 创建 ...
- QQ日迹Omi实战开发,从0到1
写在前面 相信大家对Omi应该都不陌生了,如果还有不了解的同学先看看这里.了解并使用Omi之后你会发现真的回不去了~~~ 精通Omi框架 先简单说一下吧,Omi就是一个可以快速开发项目的组件化框架,和 ...