我正在使用線程在我的程序的UI中運行長操作,以便它不鎖定。但是,在這些任務中,我需要更新控件,這不可能來自創建它們的線程。建議使用control.BeginInvoke(Delegate)來執行你想要的方法。C#Control.Invoke方法組
但是,要做到這一點,你必須聲明一個委託類型,然後纔可以調用它們。
因此,它是這樣的:如果我想執行方法無效更新(),我必須去:
delegate void CallbackVoid();
void Update() {...}
...(in task code)...
this.BeginInvoke(new CallbackVoid(Update));
這是相當煩人對於每個單獨的方法做出來那裏。我不能只是以某種方式做到這一點自然,如:
void Update() {...}
this.BeginInvoke(Update);
與control.Invoke(新的EventHandler(代表 {/ *更新控制在這裏* /})); ?哪個更好? – Arie 2013-04-05 13:24:24
@Arie兩者都是正確的,但不是其他。 MSDN表示:「委託可以是EventHandler的一個實例,在這種情況下,sender參數將包含此控件,而Event參數將包含EventArgs.Empty。委託也可以是MethodInvoker的實例或任何其他代理一個void參數列表,對EventHandler或MethodInvoker委託的調用將比對另一個委託類型的調用快得多「 – Alex 2013-04-05 13:28:42
@voo:實際上,這個*對於Windows窗體不是正確的,這就是問題的癥結所在... – 2013-04-05 13:41:42