在 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;
});
}
| < Prev | Next > |
|---|



