我有以下問題: 在異步情況下,我需要初始化一些自定義對象的領域之前,我可以與它的其他操作的進行,所以我做的:引發事件時,所有的異步方法調用完成
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)因爲我知道應該完成多少方法調用,在這種情況下,我可以做一個計數器。
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
}
我真的不喜歡任何解決方案,第一個建立事件的一個相當大的和非常可讀鏈,二是隻是...原油 - 任何人都可以提出解決這個問題的一個更優雅的方式?
感謝,透明和靈活的解決方案 – 2010-09-08 15:13:27
您可能想要使用聯鎖機制來避免併發問題增量和減量操作。 Interlocked.Increment(...)是一個很好的方法來做到這一點 – 2010-09-08 21:26:06