2011-07-28 3 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(...)を呼び出してそこで停止します。

Dispatchersの仕組みについての洞察は非常に高く評価されます。

ありがとうございました。

答えて

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); 
    } 
} 
関連する問題