首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 2.0 新特性深度解析(十三):跨執行緒 UI 操作與委派推論

     編輯:關於C語言

WinForms 執行緒親和性問題

Windows Forms 控件繫結建立它們的 UI 執行緒。.NET 2.0 強制檢查:非 UI 執行緒直接存取控件屬性/方法拋出異常。解決方案:Control.Invoke/BeginInvoke 封送至 UI 執行緒。

ISynchronizeInvoke 介面

public interface ISynchronizeInvoke
{
    bool InvokeRequired { get; }
    IAsyncResult BeginInvoke(Delegate method, object[] args);
    object EndInvoke(IAsyncResult result);
    object Invoke(Delegate method, object[] args);
}

Control 實作此介面。使用模式:

if (control.InvokeRequired)
    control.Invoke(delegate { control.Text = "新值"; });
else
    control.Text = "新值";

封裝模式:SafeLabel 範例

繼承 Label,重寫 Text 屬性自動處理封送:

public class SafeLabel : Label
{
    delegate void SetString(string text);
    delegate string GetString();

    public override string Text
    {
        set
        {
            if (InvokeRequired)
                Invoke(new SetString(delegate(string t) { base.Text = t; }), new object[] { value });
            else
                base.Text = value;
        }
        get
        {
            if (InvokeRequired)
                return (string)Invoke(new GetString(delegate { return base.Text; }), null);
            return base.Text;
        }
    }
}

匿名方法作為委派內文,簡潔封裝封送邏輯。

委派推論

C# 2.0 允許直接將方法名指派給委派變數,編譯器自動推論委派型別並建立實例:


// C# 1.x
SomeDelegate del = new SomeDelegate(SomeMethod);
// C# 2.0
SomeDelegate del = SomeMethod; // 編譯器推論型別、檢查簽名、建立實例

實務應用

  • 啟動執行緒:new Thread(ThreadMethod) 無需 new ThreadStart(...)。
  • 非同步回調:BeginInvoke(MethodName, CallbackMethod) 雙重推論,省略 AsyncCallback 建構。

委派推論大幅減少樣板碼,提升可讀性,成為 C# 2.0 慣用寫法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved