2010-09-23 30 views
8

Tôi có một kiểu xem được sử dụng làm nguồn dữ liệu cho điều khiển tùy chỉnh của tôi. Trong phương thức khởi tạo của mô hình khung nhìn, tôi thiết lập một WMI ManagementEventWatcher và khởi động nó. Mô hình khung nhìn của tôi triển khai IDisposable, vì vậy tôi dừng trình theo dõi trong phương thức Vứt bỏ.cách dọn dẹp mô hình xem đúng cách?

Khi tôi nhúng điều khiển tùy chỉnh vào cửa sổ và sau đó đóng cửa sổ để thoát khỏi ứng dụng, hãy ném InvalidComObjectException nói rằng "đối tượng COM đã được tách khỏi RCW cơ bản không thể sử dụng". Điều này xảy ra vì người quan sát của tôi, và nếu tôi không tạo ra nó, không có ngoại lệ. không có thông tin bổ sung về ngoại lệ, chẳng hạn như dấu vết ngăn xếp, v.v.

Tôi đoán là có gì đó giữ mô hình xem cho đến khi luồng mà người xem sử dụng chấm dứt nhưng trước khi người xem dừng lại và tôi không biết cách xử lý này.

Bất cứ lời khuyên? Cảm ơn Konstantin

public abstract class ViewModelBase : IDisposable, ... 
{ 
    ... 

    protected virtual void OnDispose() { } 

    void IDisposable.Dispose() 
    { 
     this.OnDispose(); 
    } 
} 

public class DirectorySelector : ViewModelBase 
{ 
    private ManagementEventWatcher watcher; 

    private void OnWMIEvent(object sender, EventArrivedEventArgs e) 
    { 
     ... 
    } 

    protected override void OnDispose() 
    { 
     if (this.watcher != null) 
     { 
      this.watcher.Stop(); 
      this.watcher = null; 
     } 
     base.OnDispose(); 
    } 

    public DirectorySelector() 
    { 
     try 
     { 
      this.watcher = new ManagementEventWatcher(new WqlEventQuery(...)); 

      this.watcher.EventArrived += new EventArrivedEventHandler(this.OnWMIEvent); 
      this.watcher.Start(); 
     } 
     catch (ManagementException) 
     { 
      this.watcher = null; 
     } 
    } 
} 
+0

sẽ rất hay khi biết bạn đang làm việc với ngôn ngữ nào;) nhưng dù sao ... một "mô hình xem"? âm thanh như bạn đang kinda trộn những thứ mà nên được thực sự tách ... –

+0

tôi đang sử dụng C#. Tôi đang làm việc trên một điều khiển chọn thư mục cho WPF, và điều khiển này phải có khả năng xử lý gắn kết ổ đĩa và tháo gắn kết, và cd-rom insertions/removals. vì MVVM là cách ưa thích để tách giao diện người dùng khỏi mã, tôi đang sử dụng mô hình xem trả về danh sách ổ đĩa, thư mục, v.v. và giám sát các ổ đĩa. – akonsu

Trả lời

4

bài viết này có giải pháp: Disposing WPF User Controls

về cơ bản, WPF dos dường như không sử dụng bất cứ nơi nào IDisposable, vì vậy các ứng dụng cần phải dọn dẹp bản thân một cách rõ ràng. vì vậy trong trường hợp của tôi, tôi đăng ký sự kiện Dispatcher.ShutdownStarted từ điều khiển của tôi sử dụng mô hình xem cần được xử lý và hủy bỏ DataContext của điều khiển khỏi trình xử lý sự kiện.

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