【发布时间】:2010-09-08 14:00:48
【问题描述】:
我有以下问题: 在异步上下文中,我需要先初始化一些自定义对象的字段,然后才能对其进行其他操作,所以我这样做:
class ContainingObject
{
private CustomObject _co;
SomeMethod()
{
_co = new CustomObject();
_co.InitObjectAsyncCompleted += (s,e) => DoStuff();
_co.InitObjectAsync();
}
}
class CustomObject
{
public string Field1, Field2, Field3, Field4;
public EventHandler InitObjectAsyncCompleted;
public void InitObjectAsync()
{
}
}
要注意的是,字段也通过对 WCF 服务的异步调用进行初始化,并且必须在我引发 InitObjectAsyncCompleted 事件之前初始化所有字段。 这些字段有很多,每个都使用不同的 WCF 调用进行初始化,这意味着我现在无法更改 WCF 部分,我看到了两种解决问题的方法:
1) 链式 WCF 调用,因此首先调用初始化第一个字段,然后调用 WCF 初始化第二个字段,依此类推,然后再初始化所有字段,然后我在最后一次 WCF 调用中引发“完成”事件。
public void InitObjectAsync()
{
var proxy = new ProxyFactory.GetCustomObjectProxy;
proxy.GetDataForField1Completed += (s,e) =>
{
Field1 = e.Result;
proxy.GetDataForField2Completed += (s1,e1) =>
{
Field2 = e1.Result;
//keep this up building a chain of events, when Field4 is filled, raise
// InitObjectAsyncCompleted(this, null);
};
proxy.GetDataForField2();
};
proxy.GetDataForField1();
}
2)由于我知道应该完成多少个方法调用,在这种情况下是4个,我可以做一个计数器。
public void InitObjectAsync()
{
int counter = 0;
var proxy = new ProxyFactory.GetCustomObjectProxy;
proxy.GetDataForField1Completed += (s,e) =>
{
Field1 = e.Result;
if(counter >= 3)
InitObjectAsyncCompleted(this, null);
else
counter++;
};
proxy.GetDataForField1();
proxy.GetDataForField2Completed += (s,e) =>
{
Field2 = e.Result;
if(counter >= 3)
InitObjectAsyncCompleted(this, null);
else
counter++;
};
proxy.GetDataForField2();
//repeat for all fields
}
我真的不喜欢这两种解决方案,第一个构建了一个相当大且可读性差的事件链,第二个只是......粗略 - 任何人都可以提出一种更优雅的方法来解决这个问题吗?
【问题讨论】:
标签: c# wcf events asynchronous