Метод завершения асинхронной службы WCF никогда не вызывается
Я пытаюсь реализовать асинхронный шаблон в моей службе WCF. BeginMethod
называется, но соответствующий EndMethod
никогда не называется. Отладка сервера, установка точек останова в разных местах, я заметил, что обратный вызов, который передается BeginMethod
никогда не вернется. Я подозреваю, что это причина, почему EndMethod
никогда не называется.
Код сервера структурирован следующим образом:
IAsyncResult BeginMethod([params], AsyncCallback callback, object asyncState)
{
var task = Task<MyReturnType>.Factory.StartNew(()=>
{
//Do work here
return value;
});
return task.ContinueWith(r=>
{
callback(task);
return r;
});
}
MyReturnType EndMethod(IAsyncResult asyncResult)
{
return ((Task<MyReturnType>)asyncResult).Result;
}
Моя точка останова в EndMethod
никогда не достигается, и линия callback(task);
никогда не вернется.
1 ответ
Проблема заключалась в том, что обратный вызов ожидает, что IAsyncResult
в случае, если экземпляр Task<string>
содержать объект состояния, который был передан в BeginMethod
Честно говоря, это должно было быть очевидно, но мне не хватало этого. Разные перегрузки StarNew
а также ContinueWith
сделал трюк. Выкладываю моё решение, чтобы спасти кого-то от царапин на голове.
IAsyncResult BeginMethod([params], AsyncCallback callback, object asyncState)
{
var task = Task<MyReturnType>.Factory.StartNew((s)=>
{
//Do work here
return value;
}, state);
return task.ContinueWith((t, s)=>
{
callback(t);
return t.Result;
});
}
MyReturnType EndMethod(IAsyncResult asyncResult)
{
return ((Task<MyReturnType>)asyncResult).Result;
}