2012-03-01 26 views
5

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(); 
} 

Trả lời

4

Một ListBoxitem xuất phát từ kiểm soát vì vậy nó được coi là một phần của GUI. Tôi đã có thể mong đợi một mục 'tách ra' được OK trong một chủ đề quá nhưng dường như nó không phải là.

Giải pháp hiển nhiên: xây dựng danh sách x Nội dung (chuỗi) và trì hoãn việc tạo Mục vào sự kiện đã hoàn thành.

+0

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. –

+0

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. –

+0

Ý 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;). –

Các vấn đề liên quan