长期运营进度窗口

时间:2010-09-24 23:11:49

标签: wpf multithreading

在WPF应用程序中,我将WCF的业务对象列表加载到列表框中 我想在另一个线程中加载它并显示一个进度条窗口。

但是怎么样?我需要在第二个线程中调用WCF服务并将其返回值返回到第一个(UI)线程。这是我不知道的。怎么回事? 或者在后台调用数据和显示进度的正确工作流程应该是什么?

现在我:
- 显示进度窗口
- 创建一个新线程并调用WCF服务
- 返回值< - 我不知道
- 关闭窗口

但是 - 这个工作流程是对的吗?

我不想使用后台工作,因为我可以调用许多不同的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();
    }
}

我正在捕捉WCFClient的 Onconnecting OnClosing 事件,并使用进度条打开和关闭一个新窗口。

但是我没有在新线程中调用WCF服务,因为我不知道如何。

谢谢,我尝试了两天不成功。

2 个答案:

答案 0 :(得分:2)

  

我不想使用后台工作,因为我可以调用许多不同的WCF服务,而不仅仅是我可以写入DoWork方法的服务。

首先,您可以决定在准备BackgroundWorker时要调用哪种DoWork方法。但是你也可以(并且这可能更易于维护)编写任意复杂度的DoWork方法。例如,您可以编写一个带有Client类型参数的DoWork方法,并让它在该对象上调用成员方法。这种方法绝对没有任何限制。

我实现进度条窗口的方式:

  1. 实现一个公开三种方法的Task类:SetUpExecuteTearDown,以及Status属性,它是一个结构包含int PercentCompletestring Message。实施INotifyPropertyChanged
  2. 实施更新protected UpdateStatus并提升Status的{​​{1}}方法。
  3. 构建一个实现PropertyChanged方法的模态窗口。在该方法中,请致电ShowDialog(Task t),然后创建t.SetUp()
  4. 处理BackgroundWorker并让处理程序引发t.PropertyChanged的{​​{1}}事件。
  5. BackgroundWorker的{​​{1}}事件处理程序使用ProgressChanged来更新用户界面,
  6. BackgroundWorker的{​​{1}}事件处理程序调用{​​{1}}。
  7. 让它的ProgressChanged事件处理程序都处理异常(不要忽视这一点!)并调用t.Status
  8. 根据需要构建和测试BackgroundWorker子类。
  9. 每当您需要显示进度条窗口时,请实例化相应的DoWork,设置所需的任何属性,然后调用t.Execute()。这将显示窗口和块并在后台进程运行时等待,随着时间的推移更新UI;它将在RunWorkerCompleted被调用后返回。

答案 1 :(得分:0)

BackgroundWorker是你的朋友。它为您进行线程编组,让您担心只进行实际工作。