2009-08-11 25 views
6

Tôi có một chủ đề gọi một đối tượng nhận một số nội dung từ Internet. Khi đối tượng này được lấp đầy với tất cả các thông tin cần thiết, nó làm tăng một sự kiện với một đối tượng sẽ tất cả các thông tin. Sự kiện này được tiêu thụ bởi bộ điều khiển đã bắt đầu chuỗi.Chủ đề WPF và GUI cách truy cập đối tượng từ chuỗi khác nhau?

Đối tượng trả về từ sự kiện này được thêm vào bộ sưu tập được liên kết với GUI thông qua phương pháp Xem mô hình.

Vấn đề là tôi không thể sử dụng CheckAccess với các ràng buộc ... làm thế nào tôi có thể khắc phục vấn đề sử dụng Object đã được tạo ra từ một chủ đề khác của chính?

Các lỗi mà tôi nhận được khi tôi thêm các đối tượng để bộ sưu tập của các chủ đề chính là:

Đây là loại CollectionView không hỗ trợ thay đổi SourceCollection của nó từ một thread khác nhau từ sợi Dispatcher.

này các bộ điều khiển:

public class WebPingerController 
{ 
    private IAllQueriesViewModel queriesViewModel; 

    private PingerConfiguration configuration; 

    private Pinger ping; 

    private Thread threadPing; 

    public WebPingerController(PingerConfiguration configuration, IAllQueriesViewModel queriesViewModel) 
    { 
     this.queriesViewModel = queriesViewModel; 
     this.configuration = configuration; 
     this.ping = new Pinger(configuration.UrlToPing); 
     this.ping.EventPingDone += new delPingerDone(ping_EventPingDone); 
     this.threadPing = new Thread(new ThreadStart(this.ThreadedStart)); 
    } 


    void ping_EventPingDone(object sender, QueryStatisticInformation info) 
    { 
     queriesViewModel.AddQuery(info);//ERROR HAPPEN HERE 
    } 

    public void Start() 
    { 
     this.threadPing.Start(); 
    } 

    public void Stop() 
    { 
     try 
     { 
      this.threadPing.Abort(); 
     } 
     catch (Exception e) 
     { 

     } 
    } 

    private void ThreadedStart() 
    { 
     while (this.threadPing.IsAlive) 
     { 
      this.ping.Ping(); 
      Thread.Sleep(this.configuration.TimeBetweenPing); 
     } 
    } 
} 

Trả lời

6

Tôi đã tìm thấy giải pháp trên blog này.

Thay vì chỉ gọi bộ sưu tập để thêm đối tượng từ chuỗi.

queriesViewModel.AddQuery(info); 

Tôi phải chuyển chủ đề chính cho bộ điều khiển và sử dụng bộ điều phối. Câu trả lời của bảo vệ rất gần.

public delegate void MethodInvoker(); 
    void ping_EventPingDone(object sender, QueryStatisticInformation info) 
    { 
     if (UIThread != null) 
     { 

      Dispatcher.FromThread(UIThread).Invoke((MethodInvoker)delegate 
      { 
       queriesViewModel.AddQuery(info); 
      } 
      , null); 
     } 
     else 
     { 
      queriesViewModel.AddQuery(info); 
     } 
    } 
+1

Bạn có thể đăng định nghĩa của UIThread trong ngữ cảnh này không? Cảm ơn. Không biết phải thay thế nó bằng mã số của tôi – Para

+1

Cùng một câu hỏi. UIThread có nghĩa là gì? – zero51

+0

Nó phải là một lớp con của 'System.Windows.Threading.DispatcherObject'. – Jalal

3

một giải pháp có thể được khởi tạo các đối tượng trên chủ đề chính?

MyObject obj; 

this.Dispatcher.Invoke((Action)delegate { obj = new MyObject() }); 

Sửa: Tại một giây đọc qua, điều này có lẽ không phải là một giải pháp cho mô hình của bạn. Bạn có nhận được lỗi thời gian chạy không? Nếu đối tượng bạn đang quay trở lại là của riêng bạn, đảm bảo đối tượng là an toàn thread có thể làm cho CheckAccess không cần thiết.

+0

Loại CollectionView này không hỗ trợ thay đổi đối với SourceCollection của nó từ một chuỗi khác với chủ đề Bộ điều phối. –

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