给梦一个奔跑的方向!
PDF Print E-mail
User Rating: / 1
PoorBest 
Written by xlingfairy
Sunday, 13 June 2010 23:09
在 winform 程序中,如果要执行一个很耗时的过程,比如,请求网络资源,如果同步执行的话,会有很长时间的假死,要解决假死,就需要另开一个线程来异步执行。
 
但是异步执行有点麻烦,就是需要更改控件属性的时候,不能直接更改,需要用 BeginInvoke(异步) 或 Invoke(同步) 来实现,这两个方法,都需要一个委托方法(Delegate)。在实际编写中,需要更改的控件很多,如果用这种方法,需要写一堆委托,维护起来很麻烦。
 
今天我又查了查,发现 System.Action 委托 这个东西:
可以使用此委托以参数形式传递一个执行某操作的方法,而不用显式声明一个自定义的委托来封装此方法
如:
Action showMethod = testName.DisplayToWindow;
showMethod();
 
Lambda 写法:
Action showMethod = () => testName.DisplayToWindow();
showMethod();
 
注意中间那个括号
 
 
更复杂一点的例子:
 
//扩展方法
public static void InvokeIfNeed(this Control ctr, Action act) {
  if (ctr.InvokeRequired)
    ctr.BeginInvoke(act);
  else
    act();
}
......
......
private void FillData(object o) {
    gd1.InvokeIfNeed(() => {
        bsRetailer.DataSource = CSK_Store_Retailer.All().OrderBy(r => r.RetailerName); ;
        var a = from r in db.CSK_Store_Retailers select (new{ r.RetailerId, r.RetailerName }) ;
        Dictionary<string, int?> retailers = a.ToDictionary(r => string.Format("{0} : {1}", r.RetailerName, r.RetailerId), r => (int?)r.RetailerId);
        retailers.Add("", null);
        bsRetailer.DataSource = retailers;
 
        bsRIm.DataSource = db.CSK_RetaileriContact_Maps;
        gd1.AutoGenerateColumns = false;
        gd1.DataSource = bsRIm;
    });
}
 

Add comment


Security code
Refresh

Popular Contents

Recommend

Site Info

Members : 1
Content : 143
Web Links : 7
Content View Hits : 113050

Links

 

Trace