委派與事件
delegate, 委派的意思, 依中文解釋, 是指定某些東西, 派發給別人使用.
在此可以把delegate想成是一個容器, 而裏面裝的, 都是目前類別(A)裏的方法名稱, 然後包裝成一個delegate物件.
當別的類別(B) 在某一時間點, 希望執行A裏面的方法時, 就可以在B裏先接收delegate物件, 然後將delegate解開, 執行裏面的方法.
下面代碼中模擬在主程式中開啟了一個地圖, 但因地圖開啟時間相當費時, 所以在MahalMap建構子中使用新的執行緒執行. 當地圖開啟後, 回到UI,在TextBox填入 “Map is ready”。
首先, 在namespace 宣告一個delegate OnMapReadyListener , 宣告在namespace裏的delegate, 就可以跨不同的類別. 其實此delegate就如同是一個class, 由此new 出一個物件, 並將onMpaReadyListener()方法包進去.
然後再將此物件傳送到MahalMap中. 待MahalMap執行緒完成後, 直接調用此物件.
using System;
using System.Threading;
using System.Windows;
using System.Windows.Threading;
namespace WpfApp1
{
public delegate void OnMapReadyListener();
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Btn_Click(object sender, RoutedEventArgs e)
{
MahalMap mahalMap=new MahalMap(this, new OnMapReadyListener(onMapReadyListener));
}
private void onMapReadyListener()
{
txt.Text = "Map is ready";
}
}
class MahalMap
{
Window window;
public MahalMap(Window window, OnMapReadyListener onMapReadyListener)
{
this.window = window;
new Thread(new ThreadStart(
delegate
{
Thread.Sleep(5000);
window.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
{
onMapReadyListener.Invoke();
}));
}
)).Start();
}
}
}
在MahalMap中調用委派的方法時, 使用onMapReadyListener.Invoke(), 也可簡化成 onMapReadyListener();
MahalMap在啟動新的執行緒時, 最原始的方法, 是將要執行的任務寫成一個方法, 再由
new Thread(new ThreadStart(task)).Start()執行, 而此行又可簡化成
new Thread(task).Start(), 因為編譯器會自動加上new ThreadStrart().
然而此方法只被執行一次, 因此可以在ThreadStart()中, 把任務包含在delegate中
原始的寫法如下
