2011-06-28 5 views
-3

私は単純なwpfアプリを持っています。私は別のスレッドからコントロールを更新する必要があります。 これは私のコードです別のスレッドからコントロールを更新するには?

namespace WpfApplication1 
{ 
    class Stock 
    { 
     public int StockId { get; set; } 
     public string Name { get; set; } 
    } 

    class ThreadManager 
    { 
     public AddMoscowItem MoscowDelegate { get; set; } 
     public AddLondonItem LondonDelegate { get; set; } 
     public AddNewYorkItem NyDelegate { get; set; } 

     public ThreadManager() 
     { 
      InitStocks(); 
     } 

     private static readonly object lockObject = new object(); 

     private Stock[] stocks; 

     public ThreadManager(AddMoscowItem moscowDelegate, AddLondonItem londonDelegate, AddNewYorkItem nyDelegate) 
     { 
      MoscowDelegate = moscowDelegate; 
      LondonDelegate = londonDelegate; 
      NyDelegate = nyDelegate; 
     } 

     private void InitStocks() 
     { 
      if (stocks == null) 
       lock (lockObject) 
       { 
        if (stocks == null) 
         stocks = new Stock[] 
            { 
             new Stock() {Name = "Moscow", StockId = 1}, 
             new Stock() {Name = "London", StockId = 2}, 
             new Stock() {Name = "NY", StockId = 3} 
            }; 
       } 
     } 

     public void RunStocks() 
     { 
      //here we must call methods: AddMoscowListBoxItem, AddLondonListBoxItem 
      //how to do it linking to corresponding stock? 
     } 
    } 

    public delegate void AddMoscowItem(string msg); 
    public delegate void AddLondonItem(string msg); 
    public delegate void AddNewYorkItem(string msg); 

    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     private AddMoscowItem moscowDelegate; 
     private AddLondonItem londonDelegate; 
     private AddNewYorkItem nyDelegate; 

     public MainWindow() 
     { 
      InitializeComponent(); 

      moscowDelegate = AddMoscowListBoxItem; 
      londonDelegate = AddLondonListBoxItem; 
      nyDelegate = AddNYListBoxItem; 
      RunThreads(); 
     } 

     public void RunThreads() 
     { 
      ThreadManager stockThreads = new ThreadManager(moscowDelegate, londonDelegate, nyDelegate); 
      stockThreads.RunStocks(); 
     } 

     private void Window_Loaded(object sender, RoutedEventArgs e) 
     { 

     } 

     public void AddMoscowListBoxItem(string msg) 
     { 
      if (this.lbxMoscow.Dispatcher.Thread == Thread.CurrentThread) 
      { 
       lbxMoscow.Items.Add(msg); 
      } 
      else 
      { 
       lbxMoscow.Dispatcher.Invoke(DispatcherPriority.Background, new DispatcherOperationCallback(
              delegate { lbxMoscow.Items.Add(msg); 
                 return null; 
              }), null); 
      } 
     } 

     public void AddLondonListBoxItem(string msg) 
     { 
      if (this.lbxLondon.Dispatcher.Thread == Thread.CurrentThread) 
      { 
       lbxLondon.Items.Add(msg); 
      } 
      else 
      { 
       lbxLondon.Dispatcher.Invoke(DispatcherPriority.Background, new DispatcherOperationCallback(
              delegate 
              { 
               lbxLondon.Items.Add(msg); 
               return null; 
              }), null); 
      } 
     } 

     public void AddNYListBoxItem(string msg) 
     { 
      if (this.lbxNY.Dispatcher.Thread == Thread.CurrentThread) 
      { 
       lbxNY.Items.Add(msg); 
      } 
      else 
      { 
       lbxNY.Dispatcher.Invoke(DispatcherPriority.Background, new DispatcherOperationCallback(
              delegate 
              { 
               lbxNY.Items.Add(msg); 
               return null; 
              }), null); 
      } 
     } 
    } 
} 

アドバイスは適切です!

+0

質問は何ですか? –

+0

スレッドを作成するのを忘れましたが、件名に質問があります。別のスレッドからコントロールを更新するにはどうすればよいですか? – user818479

答えて

4

WPFコントロールにはスレッドアフィニティがあるため、別のスレッドから状態を更新することはできません。 UIスレッドに更新をマーシャリングするには、コントロールのDispatcherを使用する必要があります。たとえば、TextBoxを更新するには:

textBox.Dispatcher.Dispatcher.Invoke(
     System.Windows.Threading.DispatcherPriority.Normal, 
     new Action(
     delegate() 
     { 
      textBox.Text = "Hello World"; 
     } 
    )); 
+1

と私はそれを使用します。私のコードを見てください。他のスレッドで作成されたクラスからこれらのメソッドを呼び出す方法がわかりません – user818479

+0

@ user818479ウィンドウにテキストを設定する方法があります。または、テキストボックスを返すウィンドウクラスにプロパティを設定できますテキストを設定するだけでなく、もっと多くのことをする必要がある場合は、他のクラスにそれは主にあなたが何を達成したいのかの問題です。それに応じて実装を設計します。 – Manfred

関連する問題