2011-07-28 32 views
1

因此,這裏是我的代碼:DispatcherObject繼承和用法...我沒有得到什麼?

class Program 
{ 
    static DispatchClass dc; 

    [STAThread] 
    static void Main(string[] args) 
    { 
    dc = new DispatchClass(); 

    Thread th = new Thread(AccessDC); 
    th.Start(); 

    Console.ReadKey(); 
    } 

    private delegate void AccessDCDelegate(object state); 
    static private void AccessDC(object state) 
    { 
    if(dc.Dispatcher.CheckAccess()) 
     dc.Print("hello"); 
    else 
     dc.Dispatcher.Invoke(new AccessDCDelegate(AccessDC)); 
    } 
} 

public class DispatchClass : DispatcherObject 
{ 
    public void Print(string str) 
    { 
    Console.WriteLine(str); 
    } 
} 

現在...輸出我所期待的,這是所創建的線程檢查調度訪問,看到它是在不同的線程,然後調用AccessDC( ...)在原始線程上,然後檢查並看到它在正確的線程上並調用dc.Print(...)。

究竟發生了什麼,它得到CheckAccess()並正確地看到它不在正確的線程上,然後調用Invoke(...)並在那裏停止。

深入瞭解Dispatcher的工作方式將不勝感激。

謝謝。

回答

2

調度程序需要消息泵,控制檯應用程序默認沒有消息泵。嘗試將它作爲GUI應用程序來運行 - 這將有一個消息泵。

0

CheckAccess驗證您的CurrentThread DispatchClass是當前線程,因此它返回給您False。這很正常。 在這個代碼片段

dc.Dispatcher.Invoke(new AccessDCDelegate(AccessDC)); 

您有爭論的問題就是這樣。

這段代碼的代碼工作:

public partial class MainWindow : Window 
{ 
    static DispatchClass dc; 

    public MainWindow() 
    { 
     InitializeComponent(); 


     dc = new DispatchClass(); 

     Thread th = new Thread(AccessDC); 
     th.Start(); 

    } 
    private delegate void AccessDCDelegate(object state); 
    static private void AccessDC(object state) 
    { 
     if (dc.Dispatcher.CheckAccess()) 
      dc.Print("hello"); 
     else 
      dc.Dispatcher.BeginInvoke(new Action(()=> AccessDC(null))); 
    } 

} 

public class DispatchClass : DispatcherObject 
{ 
    public void Print(string str) 
    { 
     MessageBox.Show(str); 
    } 
}