2010-09-24 46 views
1

我通過WCF將一個業務對象列表加載到一個列表框中。
我想加載到另一個線程並顯示進度條窗口。WPF應用程序中的長期操作進度窗口

但是如何?我需要在第二個線程中調用WCF服務,並將其返回值返回給第一個(UI)線程。這是我不知道的一點。如何返回? 或者什麼應該是在後臺調用數據和顯示進度的正確工作流程?

現在我:
- 顯示進度窗口
- 創建一個新的線程,並調用WCF服務
- 返回值< - 我不知道
- 關閉窗口

但是 - 這工作流程是否正確?

我不想使用backgroundworker,因爲我可以調用許多不同的WCF服務,而不僅僅是一個我可以寫入DoWork方法的服務。

我有一個WCFClient類,我在其中調用所需的所有服務。這裏是方法一(所有的方法都是相同只要求不同的服務):

public class Client 
{ 
    public List<BusinessDto> GetBusinesses(int userID) 
    { 
     OnConnecting(); 

     ServiceClient client = null; 
     BusinessDto[] dtos = null; 
     try 
     { 
      client = new ServiceClient(); 
      dtos = client.GetBusinesses(userID); 
     } 
     catch 
     { 
      MessageBox.Show(Properties.Resources.ConnectionNotSucessful, Properties.Resources.ApplicationName, MessageBoxButton.OK, MessageBoxImage.Error); 
     } 
     finally 
     { 
      if (client != null) client.Close(); 

      OnClosing(); 

     } 
     return dtos.ToList(); 
    } 
} 

我趕上了Onconnecting和WCFClient開放OnClosing事件和關閉一個新的窗口進度。

但我不會在新線程中調用WCF服務,因爲我不知道如何。

謝謝,我試圖做兩天不成功。

+0

請顯示您嘗試過的內容的示例代碼,如果您向我們展示您嘗試過的內容,則可以更輕鬆地給出建議。另外,儘可能簡化您的示例。 – Kiril 2010-09-25 02:07:59

回答

2

我不想使用backgroundworker,因爲我可以調用許多不同的WCF服務,而不僅僅是一個我可以寫入DoWork方法的服務。

那麼,首先,您可以決定在準備BackgroundWorker時要調用多個DoWork方法中的哪一個。但是你也可以(並且這可能更易於維護)編寫任意複雜度的DoWork方法。例如,您可以編寫一個DoWork方法,該方法接受類型爲Client的參數,並讓它在該對象上調用成員方法。這種方法絕對沒有限制。

我實現進度條窗口的方式:

  1. 實現一個Task類公開三個方法:SetUpExecuteTearDown,以及一個Status屬性,它是包含int PercentComplete一個struct和。實施INotifyPropertyChanged
  2. 實施protected UpdateStatus方法更新Status並提出PropertyChanged
  3. 構建一個實現ShowDialog(Task t)方法的模式窗口。在該方法中,請撥打t.SetUp(),然後創建BackgroundWorker
  4. 處理t.PropertyChanged並讓處理程序提高BackgroundWorkerProgressChanged事件。
  5. BackgroundWorkerProgressChanged事件處理程序使用t.Status更新UI,
  6. BackgroundWorkerDoWork事件處理程序調用t.Execute()
  7. 有其RunWorkerCompleted事件處理程序都處理異常(不要忽略此!)並致電t.TearDown()
  8. 根據需要構建和測試Task子類。
  9. 無論何時您需要顯示進度條窗口,請實例化相應的Task,設置所需的任何屬性,然後致電ProgressBarWindow.ShowDialog(t)。這將顯示窗口並阻止,並在後臺進程運行時等待,隨着UI的更新而更新;它會在t.TearDown()被調用後返回。
0

BackgroundWorker是你的朋友。它爲你做線程編組,讓你擔心只做實際工作。