您的位置:首页 > 编程语言 > C#

C#跨线程修改控件——从MSIL和汇编看Invoke, 多线程, 事件与事件委托

2013-05-28 11:43 411 查看
C#跨线程修改控件——从MSIL和汇编看Invoke, 多线程, 事件与事件委托

许可协议:

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 -
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐