this.BeginInvoke(() => { this.btnQuery.Enabled = false; //禁用查詢 });
跨線程調用時,編譯上面的代碼將提示
對於Control.Invoke()來說,任何的代理類型都是可接受的,也就是說ThreadStart和MethodInvoker都是可以接受的類型。這樣編譯器反而不知道應該用哪個代理去匹配匿名函數了,導致了編譯錯誤的發生。
知道了原因,問題就很容易解決了。我們只需要加上MethodInvoker這個wrapper就能使用匿名函數了。
Invoke(new MethodInvoker(delegate { Text = "test"; }));
或者更簡單地,用Lambda表達式來解決問題:
Invoke(new MethodInvoker(() => Text = "test"));