私はシルバーライトの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();
}
ありがとうございます。はい、それはOKではなく、それでも面白くないことは少し不必要なようです。私は 'ListBoxItem'を色付けなどのコンテンツに基づいて処理していますので、単純に文字列を作成することはできません。しかし、必要な情報をKeyValuePairなどにパックして管理する創造。 –
あなたはアイテムのミニViewModelを考えることができます。 ItemsSourceにリストをバインドするだけで、スレッドセーフが設定されます。 –
良いアイデア!私はおそらくそれを行うでしょう、プロジェクトの残りの部分であまりにも多くの変更を必要としないはずです(私は望みます;)。 –