Re: [心得] delegate();之心得
※ 引述《starlife672 (我愛秋愛我)》之銘言:
: Control.CheckForIllegalCrossThreadCalls=false; (方法一)
這不是好作法,因為當發生問題時,怎麼死的都不知道
如果是經常性使用到的方法,例如幾秒鐘就會呼叫一次的話
建議建立一個實體 Delegate 來呼叫,而不是一直產生暱名 Delegate
我直接改在下面
: //(1).設定好委派事件
: private delegate void ControlDelegate(string id,object obj);
private ControlDelegate _setStatusDelegate; // 宣告 Delegate 實體
public static void Main(string[] args) // 或是 Form_Load
{
_setStatusDelegate = new ContrlDelegate(this.SetStatusDelegate);
........
}
: //(2).設定好讓Thread要叫用的方法
: public SetStatus(string id,object obj){
: this.invoke(new ContrlDelegate(this.SetStatusDelegate),
: new object[]{id,obj});
改成 this.invoke(_setStatusDelegate, id, obj);
另外 invoke 方法的第二參數是 params object[]
所以不需要 new object[]
詳細請見 params 關鍵字的說明
: //(3).真正執行方法的地方
: private SetStatusDelegate(string id,object obj){
: if(id.Equals("Message")){
: this.label1.Text = (string)obj;
: }
: else if(id.Equals("FileInfo")){
: FileInfo info = (FileInfo)obj;
: }
: }
: 到時候我只要在Thread中,透過SetStatus("Message","Starlife是帥哥");
: 就ok了
--
my blog: http://kenshinnn.blogspot.com
operation system : Ubuntu GNU/linux
window manager : Gnome
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.117.167.161
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 3 篇):