获取" UnauthorizedAccessException"在BackgroundWorker中,无需访问UI线程

时间:2012-03-01 14:17:37

标签: c# asp.net silverlight

我在后台工作上做了一些繁重的工作,所以它不会影响我的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();
}

1 个答案:

答案 0 :(得分:4)

ListBoxitem派生自Control,因此它被视为GUI的一部分。我原本期望一个'分离的'项目在一个线程中也可以,但显然它不是。

显而易见的解决方案:建立内容(字符串)的列表x,并将项目的创建延迟到已完成的事件。