C_Sharp 板


LINE

  这是用万恶的反组译程式看来的...,因为MS的设计师都是高手,所以我也想偷学 几手。先前想找出能够WPF、WinForm通用的跨执行绪存取UI方式,但是不知道是我的关 键字很不关键,还是Google大神真的神不起来,而且MSDN论坛也没人回应,所以只好自 己想办法。   Windows Form的范例通常是呼叫继承於System.Windows.Form.Control的Invoke或 BeginInvoke方法,而WPF则是要呼叫System.Windows.Conrtol的Dispatcher属性中的 Invoke或BeginInvoke方法。      确实,这两个方法可以达成需求,但是之前我把程式写成Dll要给WinForm跟WPF参 考来做介面的时候就出现很大的窘境。我希望能够让用於视觉化介面显示资料进度的事 件可以在Dll内部就写好跨执行绪,而不用到撰写UI的时候在各平台实作。   这是看了BackgroundWorker的ReportProgress方法怎麽做到跨执行绪,然後才知道 有这麽强大的类别。   [SynchronizationContext 类别]   如果看不懂Post方法传送委派内容的匿名方法 (Anonymous Method) ,请参考 Lambda 运算式。如果你还是看不懂,那简单来说它就是建立一个匿名方法并存入这个委 派的执行个体,引数内容(小括号内)是根据委派的规则,而大括号是方法主体。例如 SynchronizationContext.Post方法必须传送一个SendOrPostCallBack委派执行个体。 这个委派是一个不回传(Void)且有一个Object型别变数作为引数的方法。所以小括号内 就建立一个变数 "obj" 接收方法引数,不用宣告变数的型别,因为委派已经帮你决定了。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; namespace Test { public class Progame { // Main程式进入点,这里不重要,只是方便你复制贴上就可编译测试而已。 public static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new myForm()); } } public partial class myForm : Form { // 先宣告一个全域变数以便储存主要执行绪的同步处理物件执行个体。 SynchronizationContext mainThread; // 这是用来储存稍後用於测试的次要执行绪。 Thread myThread; public myForm() { //这是IDE自动建立的UI初始化方法,不重要。 InitializeComponent(); //呼叫SynchronizationContext的静态属性Current,且把get值存到       //mainThread变数内。 mainThread = SynchronizationContext.Current; } private void myMethod() { //底下这行如果呼叫myThread.Start()绝对会出现例外状况。 //this.Text = " Finished!!"; //mainThread的值已经在Form类别的建构函式存入,因此现在可以使用。 //这是重头戏,SynchronizationContext有两种跨执行绪存取方法可供使       //用。Post(非同步,类似Control.BeginInvoke(delegate))、Send(同步       //,类似Control.Invoke(delegate)) mainThread.Post ( new SendOrPostCallback ( //匿名方法的引数 (obj) //语汇基元又称为 Lambda 运算子。 => //匿名方法主体 { this.Text = (String)obj; } ) , "Finished!!" ); } private void StartBT_Click(object sender, EventArgs e) { if (myThread != null && !myThread.IsAlive && myThread.ThreadState != ThreadState.Stopped) myThread.Start(); else { myThread = new Thread(new ThreadStart(myMethod)); StartBT_Click(null, null); } } //此行以下完全不重要。 private System.ComponentModel.IContainer components = null; protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } private void InitializeComponent() { this.StartBT = new System.Windows.Forms.Button(); this.SuspendLayout(); // // StartBT // this.StartBT.Location = new System.Drawing.Point(103, 58); this.StartBT.Name = "StartBT"; this.StartBT.Size = new System.Drawing.Size(75, 23); this.StartBT.TabIndex = 0; this.StartBT.Text = "Start"; this.StartBT.UseVisualStyleBackColor = true; this.StartBT.Click += new System.EventHandler(this.StartBT_Click); // // myForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(292, 142); this.Controls.Add(this.StartBT); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; this.Name = "myForm"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "myForm"; this.ResumeLayout(false); } private System.Windows.Forms.Button StartBT; } } --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 58.86.18.20 ※ 编辑: optimist9266 来自: 218.160.112.198 (05/15 22:51)
1F:推 F23ko:好深奥.... 05/16 16:00
※ 编辑: optimist9266 来自: 58.86.18.17 (06/05 02:29)







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BuyTogether站内搜寻

TOP