Метод завершения асинхронной службы 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;
}
Другие вопросы по тегам