我有一个 WPF MVVM 应用程序。视图模型有几个绑定到视图的属性,这些属性由直接来自数据库的数据或通过位于视图模型和数据库之间的 wcf 服务填充。数据连接模式的选择取决于客户端应用程序的 App.config 文件中的应用程序设置。我想实现我自己的异步调用服务方法并处理它们的返回值的方式。我想知道如果我使用任务以下列方式实现线程问题是否有机会:
服务调用流程:ViewModel > ServiceAgent > (MyWCFServiceClient or MyBusinessClient) > MyBusinessClass> Database 为了使用服务操作,我有一个 MyWCFServiceClient 类,它实现了 IMyWCFService(在添加服务引用时生成)。
此外,我有一个 MyBusinessClassClient 类,它从同一个 IMyWCFService 接口实现。因此,MyWCFService 和 MyBusinessClient 都具有相同的方法签名。我选择在生成服务客户端时不生成任何异步方法,因为如果这样做,我可能还需要在 MyBusinessClient 中实现由 IMyWCFService 生成的许多不必要的东西。
假设我有一个方法 GetEmployee(int id),它返回一个在 IMyWCFService 中定义的 Employee 对象。因此,MyWCFServiceClient 和 MyBusinessClient 类都有自己的实现。
在我的 ViewModel 中,我有:
private void btnGetEmployee_Click()
{
ServiceAgent sa = new ServiceAgent ();
//this call/callback process the service call result
sa.GetEmployee(1673, (IAsyncResult ar) =>
{
Task<Employee> t1 = (Task<Employee>)ar;
Employee = t1.Result;
//do some other operation using the result
//do some UI updation also
});
}
//this property is bound a label in the view
private Employee _employee;
public Employee Employee
{
get
{
return _ employee;
}
set
{
_ employee = value;
OnPropertyChanged(() => Employee);
}
}
ServiceAgent 类实现如下:
public class ServiceAgent
{
private IMyWcfService client;
public ProxyAgent()
{
//The call can go to either MyWCFServiceClient or
//MyBusinessClient depending on this setting
//client = new MyBusinessClient();
//OR
client = new MyWcfServiceClient();
}
public void GetEmployee(int id, AsyncCallback callback)
{
//My implementation to execute the service calls asynchronously using tasks
//I don’t want to use the complex async mechanism generated by wcf service reference ;)
Task<Employee> t = new Task<Employee>(()=>client.GetEmployee(id));
t.Start();
try
{
t.Wait();
}
catch (AggregateException ex)
{
throw ex.Flatten();
}
t.ContinueWith(task=>callback(t));
}
}
这冻结了我的用户界面。我想避免这种情况。另外我想知道这是否是我想要实现的正确方法。我对任务/线程和回调的经验较少,因此我想知道我将来是否会遇到任何问题(线程/内存管理等)。