得到";UnauthorizedAccessException”;在BackgroundWorker中,而不访问
本文关键字:BackgroundWorker 访问 quot UnauthorizedAccessException 得到 | 更新日期: 2023-09-27 18:26:11
我正在做一些繁重的后台工作,这样就不会影响我的Silverlight UI线程。然而,在DoWork函数中,我得到了这个异常:
UnauthorizedAccessException
"无效的跨线程访问"。
我知道我不能从BackgroundWorker访问UI线程,但是,这个异常发生在这一行:
ListBoxItem insert = new ListBoxItem();
那是怎么访问我的ui线程的??
这是我将其缩小到的实际代码段。我基本上是在创建列表项,我想将其插入到sourceList
列表框中:
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();
}
ListBoxitem
源自Control,因此它被视为GUI的一部分。我本以为线程中的"分离"项也可以,但显然不是。
显而易见的解决方案是:建立一个内容(字符串)的列表x
,并将Items的创建延迟到Completed事件。