在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服务,因为我不知道如何。
谢谢,我尝试了两天不成功。
答案 0 :(得分:2)
我不想使用后台工作,因为我可以调用许多不同的WCF服务,而不仅仅是我可以写入DoWork方法的服务。
首先,您可以决定在准备BackgroundWorker时要调用哪种DoWork方法。但是你也可以(并且这可能更易于维护)编写任意复杂度的DoWork方法。例如,您可以编写一个带有Client
类型参数的DoWork方法,并让它在该对象上调用成员方法。这种方法绝对没有任何限制。
我实现进度条窗口的方式:
Task
类:SetUp
,Execute
和TearDown
,以及Status
属性,它是一个结构包含int PercentComplete
和string Message
。实施INotifyPropertyChanged
。protected UpdateStatus
并提升Status
的{{1}}方法。PropertyChanged
方法的模态窗口。在该方法中,请致电ShowDialog(Task t)
,然后创建t.SetUp()
。 BackgroundWorker
并让处理程序引发t.PropertyChanged
的{{1}}事件。 BackgroundWorker
的{{1}}事件处理程序使用ProgressChanged
来更新用户界面,BackgroundWorker
的{{1}}事件处理程序调用{{1}}。ProgressChanged
事件处理程序都处理异常(不要忽视这一点!)并调用t.Status
。BackgroundWorker
子类。DoWork
,设置所需的任何属性,然后调用t.Execute()
。这将显示窗口和块并在后台进程运行时等待,随着时间的推移更新UI;它将在RunWorkerCompleted
被调用后返回。答案 1 :(得分:0)
BackgroundWorker
是你的朋友。它为您进行线程编组,让您担心只进行实际工作。