2012-03-01 14 views
5

私はシルバーライトのUIスレッドに影響を与えないように、バックグラウンドワーカーに多大な労力をかけています。しかし、DoWork関数では、この例外が発生します。UIスレッドにアクセスしないでBackgroundWorkerで「UnauthorizedAccessException」を取得する

UnauthorizedAccessException "無効なクロススレッドアクセス"。私はBackgroundWorkerのからUIスレッドにアクセスすることはできません知っている

は、しかし、この例外は、この行に発生します。私のUIスレッドにアクセスしていることをどのように

ListBoxItem insert = new ListBoxItem(); 

ここでは、私がそれを絞り込んだ実際のコードを示します。

void FillSourceList() 
{ 
    busyIndicator.IsBusy = true; 
    BackgroundWorker bw = new BackgroundWorker(); 
    bw.DoWork += (sender, args) => 
     { 
      List<ListBoxItem> x = new List<ListBoxItem>(); 
      for (int i = 0; i < 25; i++) 
      { 
       ListBoxItem insert = new ListBoxItem(); //<---Getting exception here 
       insert.Content = "whatever"; 
       x.Add(insert); 
      } 
      args.Result = x; 
     }; 
    bw.RunWorkerCompleted += (sender, args) => 
     { 
      foreach (ListBoxItem insert in (List<ListBoxItem>)(args.Result)) 
       sourceList.Items.Add(insert); 
      busyIndicator.IsBusy = false; 
     }; 

    bw.RunWorkerAsync(); 
} 

答えて

4

それはGUIの一部とみなされるので、ListBoxitemはControlから派生:私は基本的に私はsourceListリストボックスに挿入したいlistboxitemsを作成する仕事をしています。私は、スレッド内で「分離された」アイテムもOKだと思っていたでしょうが、明らかにそうではありません。

明白な解決策:コンテンツ(文字列)のリストxを構築し、アイテムの完了を完了イベントに遅らせる。

+0

ありがとうございます。はい、それはOKではなく、それでも面白くないことは少し不必要なようです。私は 'ListBoxItem'を色付けなどのコンテンツに基づいて処理していますので、単純に文字列を作成することはできません。しかし、必要な情報をKeyValuePairなどにパックして管理する創造。 –

+0

あなたはアイテムのミニViewModelを考えることができます。 ItemsSourceにリストをバインドするだけで、スレッドセーフが設定されます。 –

+0

良いアイデア!私はおそらくそれを行うでしょう、プロジェクトの残りの部分であまりにも多くの変更を必要としないはずです(私は望みます;)。 –

関連する問題