2013-02-11 63 views
0

我正在研究WPF支持工具,該工具查看共享Outlook郵箱,收集文件夾,在TabControl中創建TabItems以表示文件夾,然後收集它找到的MailItems在過去14天的文件夾中。每個文件夾可能只有大約十幾個MailItems,所以在任何時候都不會有大量的MailItem。Backgroundworker允許用戶界面在迭代時通過Outlook郵件項目凍結

啓動時,應用程序遍歷每個文件夾的郵件並將它們添加到MailItem列表中,稍後我將其添加到相應TabItem的列表框的綁定ObservableCollection中。

我遇到的問題是UI鎖定,因爲它遍歷Outlook文件夾中的MailItems。我添加了Backgroundworker例程來首先在後臺收集郵件,但在此期間UI仍然完全沒有響應。我不明白爲什麼這個過程不會搞亂用戶界面。

我的簡體代碼如下。請注意,除了在此示例中遍歷它們之外,我實際上並沒有對MailItem執行任何操作,但凍結了UI。爲什麼?還值得注意的是,總共有大約10個Outlook文件夾。一個TabItem(以ListBox作爲內容)被創建來表示一個文件夾,並因此會導致下面的代碼啓動 - 換句話說,在初始化過程中應該有大約10個Backgroundworkers啓動。

任何建議或想法,以更好地實施?理想情況下,我希望應用程序啓動並順利地填充顯示,而不是掛起並突然顯示所有內容。

List<MailItem> mailList = new List<MailItem>(); 

     BackgroundWorker worker = new BackgroundWorker(); 
     worker.DoWork += new DoWorkEventHandler(delegate 
      { 
       Items folderItems = folder.Items.Restrict(filter); 

       foreach (MailItem mi in folderItems.OfType<MailItem>()) 
       { 
        // would normally add to mailList here. 
       } 
      }); 
     worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(delegate 
      { 
       // then add to the ObservableCollection of the UI ListBox. 
      }); 

     worker.RunWorkerAsync(); 
     worker.Dispose(); 
+0

如果您已經在使用Backgorundworker,請嘗試使用.WhenAny或IProgress以異步方式更新您的Windows。這裏的關鍵字是[TAP](https://msdn.microsoft.com/en-us/library/hh873175.aspx)(基於任務的異步模式)。還要提防你的foreach mi循環中的創建引用 – ivo 2016-06-27 07:17:11

回答

-1

我不知道這是否是引起你的用戶界面死機,但RunWorkerAsync之後你不應該調用一個BackgroundWorkerDispose如將運行在大致相同的時間DoWorkRunWorkerCompleted之前。您可以在RunWorkerCompleted處理程序中調用Dispose(我更喜歡這樣做,因爲它將所有內容都保存在一個位置),或保存工作人員,稍後在處理包含的類時再執行此操作。