-1

wpf でのマルチスレッドに関するいくつかのトピックを既に見つけており、ほとんどのことをディスパッチで動作させることができましたが、まだ理解していないことが 1 つあります。「stackpanel1」と呼ばれるスタックパネルがあり、これに「stackrow」と呼ばれるスタックパネルを(別のスレッドで)子として追加します。(foreach ループ)

stackPanel1.Dispatcher.Invoke(new Action(() => stackPanel1.Children.Add(stackrow)));

この質問に似ています: WPF C# - Editing a listbox from another thread

ただし、「新しい項目」は UI 要素 (stackrow) であり、次のエラーが発生します: InvalidOperationException was unhandled. 別のスレッドがこのオブジェクトを所有しているため、呼び出し元のスレッドはこのオブジェクトにアクセスできません。

この行で「stackrow」をディスパッチするにはどうすればよいですか?

編集: foreachloop で stackrow が作成されます

mainthread (新しいスレッドを作成) Thread t = new Thread(()=> addstackrows()); t.SetApartmentState(ApartmentState.STA); t.Start();

メソッド addstackrows()

private void addstackrows()
{

  Dispatcher stackpaneldispatcher = stackPanel1.Dispatcher;                 
  stackPanel1.Dispatcher.Invoke(new Action(() => 
  stackPanel1.Children.Clear()));
  stackPanel1.Dispatcher.Invoke(new Action(() => 
  stackPanel1.Orientation = Orientation.Vertical));

  foreach (var randomelement in elementcollection)
  {
      StackPanel stackrow = new StackPanel();
      Dispatcher stackrowdp = stackrow.Dispatcher;

      stackrow.Dispatcher.Invoke(new Action(() => 
      stackrow.Orientation = Orientation.Horizontal));
      stackPanel1.Dispatcher.Invoke(new Action(() =>   
      stackPanel1.Children.Add(stackrow)));

  }

}
4

1 に答える 1

0

すべての UI オブジェクトを同じスレッドで作成する必要があります。

private void addstackrows()
{

    Dispatcher stackpaneldispatcher = stackPanel1.Dispatcher;
    stackPanel1.Dispatcher.Invoke(new Action(() =>
    {
        stackPanel1.Children.Clear();
        stackPanel1.Orientation = Orientation.Vertical;
    }));

    foreach (var randomelement in elementcollection)
    {
        stackPanel1.Dispatcher.Invoke(new Action(() =>
        {
            StackPanel stackrow = new StackPanel();
            stackrow.Orientation = Orientation.Horizontal;
            stackPanel1.Children.Add(stackrow);
        }));
    }
}

また、すべての通話をグループ化しますDispatcher。呼び出すたびInvokeに、パフォーマンスのオーバーヘッドがあります。したがって、ループ内で時間のかかる操作を行わない限り、関数全体をInvoke.

于 2013-05-31T22:08:33.197 に答える