我有以下问题:
在异步上下文中,我需要初始化某个自定义对象的字段,然后才能继续对其进行其他操作,所以我这样做:
“问题在于,字段也是通过异步调用WCF服务进行初始化的,在我引发InitObjectAsyncCompleted事件之前必须初始化所有字段。 这些字段中有相当多的字段,每个字段都使用不同的WCF调用进行初始化。如果不能更改WCF部分,那么我看到解决问题的两种方法:
由于我知道应该完成多少方法调用,这里是4个,所以我可以创建一个计数器。
我并不真的喜欢这两个解决方案,第一个建立了一个相当大而且难以阅读的事件链,第二个则太过粗糙 - 有没有人能提出更优雅的解决方法?
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();
}
由于我知道应该完成多少方法调用,这里是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
}
我并不真的喜欢这两个解决方案,第一个建立了一个相当大而且难以阅读的事件链,第二个则太过粗糙 - 有没有人能提出更优雅的解决方法?