во втором вызове метода Post получается: «Асинхронный модуль или обработчик завершен, пока асинхронная операция все еще не завершена» - PullRequest
1 голос
/ 07 августа 2020

У меня есть метод ниже в моем ApiController,

public  Task<HttpResponseMessage> Post([FromBody] CardParameters paras)
{
        int amount = Convert.ToInt32(paras.Amount);
        int cashout = Convert.ToInt32(paras.CashOut);

        var promise = new TaskCompletionSource<HttpResponseMessage>();

        void getResponse(string s)
        {   
            promise.SetResult(Request.CreateResponse(s)); // this line executes in 2 seconds
        }

        AdpResponse ar =  getResponse;
        ta.purchase(amount, cashout, ar);
        return promise.Task;
}

"ta.purchase" метод находится в стороннем приложении. Это приложение вызовет метод "getResponse" в конце процесса.

Клиентское приложение получит результат при первом вызове этого метода. Но при втором вызове клиент получает ошибку "[InvalidOperationException: асинхронный модуль или обработчик завершен, пока асинхронная операция еще не завершена.]

Извините, если я повторяю старый вопрос. Мне не удалось найти ответ в stackoverflow. Спасибо, если кто-нибудь покажет мне, как решить эту проблему.

1 Ответ

0 голосов
/ 12 августа 2020

Я решил проблему, заключив весь процесс в Task. Эта статья помогла мне понять концепцию.

setResult(s) завершает задачу, но не отменяет регистрацию задачи из ASP. net. следовательно, ASP. net выдает ошибку при попытке выхода из метода. Поэтому мне пришлось использовать Task. Это сработало.

public  Task<HttpResponseMessage> Post([FromBody] CardParameters paras){
    int amount = Convert.ToInt32(paras.Amount);
    int cashout = Convert.ToInt32(paras.CashOut);

    string myResult ="";

    var _t = Task.Run(async () =>
    {
         
        var promise = new TaskCompletionSource<HttpResponseMessage>();

        void getResponse(string s)
        {   
            promise.SetResult(s); 
        }

        AdpResponse ar =  getResponse;
        ta.purchase(amount, cashout, ar);
        myResult = promise.Task.Result;
    });
    await _t;
    return Request.CreateResponse(myResult); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...