我在后台工作上做了一些繁重的工作,所以它不会影响我的Silverlight UI线程。但是,在DoWork函数中,我遇到了这个例外:
UnauthorizedAccessException
“无效的跨线程访问”。
我知道我无法从BackgroundWorker访问UI线程,但是,此行发生此异常:
ListBoxItem insert = new ListBoxItem();
如何访问我的ui线程?
这是我将其缩小到的实际代码段。我基本上正在创建listboxitems,我想插入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();
}
答案 0 :(得分:4)
ListBoxitem
派生自Control,因此它被视为GUI的一部分。我原本期望一个'分离的'项目在一个线程中也可以,但显然它不是。
显而易见的解决方案:建立内容(字符串)的列表x
,并将项目的创建延迟到已完成的事件。