C#跨线程修改控件——从MSIL和汇编看Invoke, 多线程, 事件与事件委托
2013-05-28 11:43
411 查看
C#跨线程修改控件——从MSIL和汇编看Invoke, 多线程, 事件与事件委托
许可协议:
CC BY-NC-SA
Form1.cs - Asm
这就充分说明在C#代码层面上执行的_report()函数和director_OnReport()回调函数本质上是同一个函数(段地址相同),也恰好解释了为什么Form1类中的private函数为什么可以在另一个类中触发。因为C#也好,CIL也好,都是表层的封装。而在CLR虚拟机中实实在在运行的,是CLR Assembly. 我们说CLR是虚拟机,这个“虚拟”仅仅指CLR中的指令并非与物理硬件相关联,但是CLR以及其中的指令都是真实存在的,与真实机上的x86 CPU指令本质上是相同的。C#美轮美奂的亭台楼榭都建立在Assembly的一砖一瓦之上。而在CLR Assembly层面,只有内核级的概念,有内存管理,有线程调度。。。但是没有类级属性,没有成员函数,没有作用域可访问性控制,这也是我们能够看到其实质的原因。所以我们在使用C#封装好的模块和功能模型时,如果能够同时理解其底层实现,相信会对软件开发工作大有裨益。
忽然发现写了这么多。。而且好像逻辑很混乱的样子。。权当给小白入门看的吧~ 也欢迎各路大神不吝赐教。 另PS:这是本人的处女博(无误),以后要养成写博客的好习惯~
- END -
许可协议:
CC BY-NC-SA
//直接跳到了函数director_OnReport() 00000052 nop //int value = Convert.ToInt32(postStatus); 00000053 mov ecx,dword ptr [ebp-40h] 00000056 call 03B4E948 0000005b mov dword ptr [ebp-58h],eax 0000005e mov eax,dword ptr [ebp-58h] 00000061 mov dword ptr [ebp-44h],eax //if (this.progressBar1.InvokeRequired) 00000064 mov eax,dword ptr [ebp-3Ch] 00000067 mov ecx,dword ptr [eax+00000144h] 0000006d mov eax,dword ptr [ecx] 0000006f call dword ptr [eax+00000128h] 00000075 mov dword ptr [ebp-5Ch],eax 00000078 cmp dword ptr [ebp-5Ch],0 0000007c sete al 0000007f movzx eax,al 00000082 mov dword ptr [ebp-50h],eax 00000085 cmp dword ptr [ebp-50h],0 00000089 jne 0000012D 0000008f nop
Form1.cs - Asm
这就充分说明在C#代码层面上执行的_report()函数和director_OnReport()回调函数本质上是同一个函数(段地址相同),也恰好解释了为什么Form1类中的private函数为什么可以在另一个类中触发。因为C#也好,CIL也好,都是表层的封装。而在CLR虚拟机中实实在在运行的,是CLR Assembly. 我们说CLR是虚拟机,这个“虚拟”仅仅指CLR中的指令并非与物理硬件相关联,但是CLR以及其中的指令都是真实存在的,与真实机上的x86 CPU指令本质上是相同的。C#美轮美奂的亭台楼榭都建立在Assembly的一砖一瓦之上。而在CLR Assembly层面,只有内核级的概念,有内存管理,有线程调度。。。但是没有类级属性,没有成员函数,没有作用域可访问性控制,这也是我们能够看到其实质的原因。所以我们在使用C#封装好的模块和功能模型时,如果能够同时理解其底层实现,相信会对软件开发工作大有裨益。
忽然发现写了这么多。。而且好像逻辑很混乱的样子。。权当给小白入门看的吧~ 也欢迎各路大神不吝赐教。 另PS:这是本人的处女博(无误),以后要养成写博客的好习惯~
- END -
相关文章推荐
- C#跨线程修改控件——从MSIL和汇编看Invoke, 多线程, 事件与事件委托
- C#跨线程修改控件——从MSIL和汇编看Invoke, 多线程, 事件与事件委托
- C#中跨线程访问控件:委托,Invoke,BeginInvo
- C#通过委托实现线程修改控件值
- (委托事件处理)关于多线程执行显示进度条的实例(转)&&线程间操作无效: 从不是创建控件“rtxtEntryNO”的线程访问它。
- C#线程中安全访问控件(重用委托,避免繁复的delegate,Invoke)总结
- 多线程委托之跨线程问题分析--在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke(解决方法已更新)
- 黄聪:C#“多线程线程间操作无效: 从不是创建控件的线程访问它。”,跨线程修改控件属性解决方案
- C# 多线程控制控件实例(invoke,控件的委托方法)
- C#中跨线程访问控件: 委托, Invoke, BeginInvoke
- C#线程中安全访问控件(重用委托,避免繁复的delegate,Invoke)总结
- C#中跨线程访问控件: 委托, Invoke, BeginInvoke
- VS2003 C#:重写键盘响应事件、动态创建控件、创建线程、在线程中使用委托在界面显示数据
- c#多线程(UI线程,控件显示更新) Invoke和BeginInvoke 区别
- C#多线程-不同线程之间通过事件委托封送调用方法(转)
- c#日期和事件控件的使用(日期的修改)
- c#多线程(UI线程,控件显示更新) Invoke和BeginInvoke 区别
- c# wpf 通过线程和委托制作时间控件
- c#中使用多线程访问winform中控件的若干问题 解决线程间操作无效: 从不是创建控件的线程访问它
- 利用委托解决多线程中“不是此控件创建的线程”的问题