2013-02-18 2 views
1

Все вызовы службы должны работать через личный канал. Таким образом, все методы, которые имеют доступ к прокси-серверу должен выглядеть как этот:Как переносить вызовы методов с ожиданием?

public async Task<SDRLocation[]> FindLocationsAsync(string searchString) 
    { 
     ChannelFactory<IQueryService> channel = new ChannelFactory<IQueryService>("SomeServ_IQuery"); 
     channel.Open(); 
     SomeProxy = channel.CreateChannel(); 
     Location[] locationEntitiesFound = await SomeProxy.FindLocationsAsync(searchString); 
     ((IChannel)SomeProxy).Close(); 

     return locationEntitiesFound.Select(x => new SDRLocation(x)).ToArray(); 
    } 

Но поскольку у меня есть много способов, как это обслуживания вызовов я пытался избежать дублирования кода и создать этот метод обертку:

public TResult HandleServiceCall<TResult>(Func<IPlantOrgQueryService, TResult> serviceMethod) 
    { 
     ChannelFactory<IQueryService> channel = new ChannelFactory<IQueryService>("SomeServ_IQuery"); 
     channel.Open(); 
     IQueryService newProxy = channel.CreateChannel(); 
     TResult results = serviceMethod(newProxy); 
     ((IChannel)newProxy).Close(); 

     return results; 
    } 

теперь я ожидаю, чтобы везде называет так:

public async Task<SDRLocation[]> FindLocationsAsync(string searchString) 
    { 
     Location[] locationEntitiesFound = await HandleServiceCall(x => x.FindLocationsAsync(searchString)); 

     return locationEntitiesFound.Select(x => new SDRLocation(x)).ToArray(); 
    } 

Но я в конечном итоге с ошибкой «коммуникационный объект System.ServiceModel.Channels.ClientReliableDu plexSessionChannel, не может использоваться для связи, поскольку он был отменен ».

Не понимаю, что это неправильно, потому что метод без HandleServiceCall работает просто отлично ...

Помогите пожалуйста

ответ

1

Тип TResult даст вам знать, что это не так. Это Task<Location[]>. Таким образом, вы удаляете прокси (через Close) до завершения асинхронного вызова.

Исправление составляет awaitTask перед тем, как позвонить Close, как и ваш исходный код. Это должно сделать трюк:

public async Task<TResult> HandleServiceCall<TResult>(Func<IPlantOrgQueryService, Task<TResult>> serviceMethod) 
{ 
    ChannelFactory<IQueryService> channel = new ChannelFactory<IQueryService>("SomeServ_IQuery"); 
    channel.Open(); 
    IQueryService newProxy = channel.CreateChannel(); 
    TResult results = await serviceMethod(newProxy); 
    ((IChannel)newProxy).Close(); 

    return results; 
} 
+0

Это точно, что я думал. Благодаря! –

Смежные вопросы