Tôi đang thực hiện một số công việc nặng nhọc trên nền tảng để nó không ảnh hưởng đến chuỗi giao diện người dùng Silverlight của tôi. Tuy nhiên, trong chức năng DoWork, tôi nhận được ngoại lệ này:Nhận "UnauthorizedAccessException" trong BackgroundWorker mà không truy cập vào chuỗi giao diện người dùng
UnauthorizedAccessException
"Truy cập chuỗi chéo không hợp lệ".
Tôi biết tôi không thể truy cập vào thread UI từ BackgroundWorker, Tuy nhiên, ngoại lệ này xảy ra trên dòng này:
ListBoxItem insert = new ListBoxItem();
như thế nào mà truy cập vào chủ đề ui của tôi ??
Đây là đoạn mã thực sự mà tôi đã thu hẹp xuống. Tôi về cơ bản thực hiện công việc tạo ListBoxItems mà tôi muốn chèn vào sourceList
listbox:
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();
}
Cảm ơn bạn. Có, nó có vẻ hơi không cần thiết cho điều đó không được OK nhưng thú vị dù sao. Tôi thực hiện một số xử lý khác trên 'ListBoxItem' dựa trên nội dung, chẳng hạn như tô màu, vì vậy tôi không thể tạo chuỗi đơn giản .. tuy nhiên, tôi cho rằng tôi sẽ quản lý việc đóng gói thông tin tôi cần vào KeyValuePair hoặc sự sáng tạo. –
Bạn có thể xem xét một ViewModel nhỏ cho các mục. Chỉ cần liên kết một danh sách với ItemsSource và bạn đã thiết lập, bao gồm cả an toàn luồng. –
Ý tưởng hay! Tôi có thể sẽ làm điều đó, không nên đòi hỏi quá nhiều thay đổi cho phần còn lại của dự án (tôi hy vọng;). –