2010-09-24 31 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是你的朋友。它为你做线程编组,让你担心只做实际工作。