2017-10-17 11 views
0

バックグラウンドワーカーのDoWorkメソッドでTreeViewコントロールのヘッダープロパティにアクセスしようとしています。WPF BackgroundworkerのDoWorkメソッドに渡す

私は次のことを試してみました:

var worker = new BackgroundWorker(); 
worker.DoWork += DoWork; 
worker.RunWorkerAsync(MyTreeView); 

private void DoWork(object sender, DoWorkEventArgs e) 
{ 
    var x = (e.Argument as TreeView); 
    var item1 = x.Items[0] as TreeViewItem; 

    //error here.. 
    var headerItem1 = item1.Header; 
} 

スローされるエラーは、私がアクセスできるようにするプロパティが別のスレッド(私の場合はUIスレッド)によって所有されていることを述べています。

この問題はこれまでのところTreeViewコントロールでのみ発生しました。合流し、LabelsTextBlocksのような複雑ではないコントロールにアクセスするとうまくいきました。

すべての回答ありがとうございます。

+0

TreeViewで、LabelまたはTextBlockコントロールよりも多くのデータを処理している可能性があります。可能な複製[https://stackoverflow.com/q/9732709/6026377](https://stackoverflow.com/q/9732709/6026377) –

答えて

0

ルール:は、GUIスレッドのGUI要素(コントロール)にのみアクセスします。

BackgroundWorkerには、DoWorkイベントハンドラがバックグラウンドスレッドで呼び出されます。そのスレッドのGUI要素にアクセスすることは許可されていません。アクセスとは、プロパティ(インデクサ)や呼び出しメソッドを読み書きすることを意味します。

バックグラウンドスレッドのコントロールで何かを行う必要がある場合は、Dispatcher.Invokeメソッドを使用してください。しかし、Invoke/BeginInvokeメソッドを使用すると全体のパフォーマンスが低下することがあります(タイトループで使用する場合など)。

バックグラウンドスレッドのGUI要素にアクセスする必要がないようにロジックを再設計する必要があります。これが最善の解決策になります。

ところで、私は現代の非同期パターン(async/await & Task複数可)にBackgroundWorkerから移動するために、あなたをお勧めします。

関連する問題