2016-12-22 3 views
0

У меня есть Net 2.0 код, который использует вебсервис основанный на SoapHttpClientProtocolКак перенести наследие с # 2 Еар код TPL

public void CommunicateWithWebservice() 
{ 
    var success = ws.DoSomething() 
    if(success) 
    { 
     return ws.DoSomething2(); 
    } 
    return null; 
} 

Как преобразовать этот код в EAP (https://msdn.microsoft.com/en-us/library/ms228969(v=vs.110).aspx) Паттен, не изменяя его слишком много?

Я планирую преобразовать EAP в Задачу позже (https://msdn.microsoft.com/en-us/library/ee622454(v=vs.110).aspx), поэтому он не будет блокировать поток и отпустить его в пул потоков aspnet. Webservice предоставляет методы, такие как DoSomething_Async() и событие DoSomething_Completed. Устаревший код по-прежнему должен использовать синхронный вызов.

Я знаю, что могу преобразовать его непосредственно в Задачу, однако код должен оставаться в NET 2.0. Вот почему я хочу изменить CommunicateWithWebservice на EAP (CommunicateWithWebservice, CommunicateWithWebservice_Begin, CommunicateWithWebservice_Completed), а затем завернуть в задачу для нового приложения.

ответ

0

Вы можете использовать TaskCompletionSource добиться того, что вы хотите (упрощенно без обработки ошибок, вы можете также настроить параметры делегата):

Task DoSomethingAsync(MyWebService ws) { 
    var tcs = new TaskCompletionSource<object>(); 
    ws.DoSomething_Completed = delegate(object sender, EventArgs e) { 
     tcs.SetResult(null); 
    }; 
    ws.DoSomething_Async(); 
    return tcs.Task; 
} 

TaskCompletionSource разработан специально для преобразования методов EAP в Задачи- основанные методы.

+0

У меня DLL Framework 2.0, поэтому источник завершения задачи не поможет. – user2029276

+0

Вы можете использовать сборку 4.6, ссылаться на свою сборку 2.0 и по-прежнему использовать TCS. – Sefe

+0

Да, моя проблема в том, что у меня есть код, который еще не может использовать TCS, и я хочу превратить его в код, который может это сделать. – user2029276

0

Я знаю, что могу преобразовать его в Задачу напрямую, однако код должен оставаться в NET 2.0. Вот почему я хочу изменить CommunicateWithWebservice на EAP (CommunicateWithWebservice, CommunicateWithWebservice_Begin, CommunicateWithWebservice_Completed), а затем включить в задачу для нового приложения.

Использование

AsyncCallback 

Это делегат, который позволяет определить свои собственные методы BeginXXX и EndXXX.

On BeginInvoke вы получаете IAsyncResult, у которого есть свойство IsCompleted, чтобы указать, была ли операция выполнена.

Как только вы установили эту настройку, вы можете легко обернуть методы Begin и End в метод Task.Factory.FromAsync().

Как только вы завернули в задачу, я рекомендовал использовать async/wait.

Надеюсь, это поможет!

+0

Я не вижу, как я могу это использовать. Мой «CommunicateWithWebservice_Completed» - это событие, поэтому у меня есть метод запуска и событие. Я думаю, что мне придется начинать новый поток самостоятельно и внедрять класс-оболочку, который использует 'IAsyncResult' и ждет события с' AutoResetEvent'. Я прав? – user2029276

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