여러 wcf 서비스를 동시에 쿼리하기 위해 비동기 패턴을 구현하는 방법을 배우려하지만 모든 동시 호출이 완료되었는지 확인하는 방법을 알지 못합니다. 비동기 WCF 쿼리 최종 단계
public static class ODataAsync
{
static DataServiceContext ServiceContext;
static List<DynamicEntity> Results = new List<DynamicEntity>();
private static void GetAsync(string serviceUri, NameValueCollection queryOptions, IAuthenticationScheme authenticationScheme)
{
string baseUri;
string entitySet;
string entityKey;
string queryString;
ValidateServiceUri(serviceUri, out baseUri, out entitySet, out entityKey, out queryString);
string resource = !string.IsNullOrEmpty(entityKey) ? entitySet + "(" + entityKey + ")" : entitySet;
DataServiceContext context = new DataServiceContext(new Uri(baseUri));
context.IgnoreMissingProperties = true;
ServiceContext = context;
DataServiceContextHandler handler = new DataServiceContextHandler(authenticationScheme);
handler.HandleGet(context);
DataServiceQuery<EntryProxyObject> query = context.CreateQuery<EntryProxyObject>(resource);
NameValueCollection options = HttpUtility.ParseQueryString(queryString);
options.Add(queryOptions);
foreach (string key in options.AllKeys)
{
query = query.AddQueryOption(key, options[key]);
}
try
{
query.BeginExecute(GetAsyncComplete, query);
}
catch (DataServiceQueryException ex)
{
throw new ApplicationException("An error occurred during query execution.", ex);
}
}
private static void GetAsyncComplete(IAsyncResult result)
{
QueryOperationResponse<EntryProxyObject> response =
((DataServiceQuery<EntryProxyObject>)result).EndExecute(result) as QueryOperationResponse<EntryProxyObject>;
IList<dynamic> list = new List<dynamic>();
foreach (EntryProxyObject proxy in response)
{
DynamicEntity entity = new DynamicEntity(proxy.Properties);
Results.Add(entity);
}
while (response.GetContinuation() != null)
{
Uri uri = response.GetContinuation().NextLinkUri;
response = ServiceContext.Execute<EntryProxyObject>(uri) as QueryOperationResponse<EntryProxyObject>;
foreach (EntryProxyObject proxy in response)
{
DynamicEntity entity = new DynamicEntity(proxy.Properties);
Results.Add(entity);
}
}
}
}
내 2 개 질문
은 다음과 같습니다 : 나는 다음 비동기 작업을 실행하고 클래스가 완료 작업으로 목록에 추가 한1) 나는 단지 (목록의 결과를 얻을 수 있도록 어떻게들) 모든 동시 호출이 완료되면? 예를 들어 루프 내에서 GetAsync()를 호출하는 경우 여러 동시 프로세스를 시작하면 목록 결과에서 데이터를 가져 오기 전에 모두 완료되었는지 확인해야합니다.
2) GetContinuation() 호출에서 BeginExecute()를 사용할 수 있으며 콜백 함수와 동일한 GetAsyncComplete() 메서드를 재귀 적으로 사용할 수 있습니까? 아니면 스레드를 생성하고 실제로 느려지는 것들을 만듭니다.
감사합니다.