C# Асинхронный модуль или обработчик завершены, пока асинхронная операция еще не завершена

Я только начал изучать шаблон TAP и получаю сообщение об ошибке

An asynchronous module or handler completed while an asynchronous operation was still pending

Я получаю эту ошибку в строке:

var r = await _purchaseService.UpdateEbookDownloadLinkAsync(resultOfAdding.Id, ebookUrls);

Вот как выглядит метод UpdateEbookDownloadLinkAsync:

public async Task<bool> UpdateEbookDownloadLinkAsync(Guid purchaseId, List<string> urls)
    {
        using (var database = new DatabaseContext())
        {
            var item = await database.PurchasedItems.FindAsync(purchaseId);

            if (item == null) 
            {
                return false;
            }

            var stringBuilder = new StringBuilder();

            foreach (var url in urls)
            {
                stringBuilder.Append(url).Append(';');
            }

            item.EbookDownloadLink = stringBuilder.ToString();
            database.PurchasedItems.AddOrUpdate(item);

            var i = await database.SaveChangesAsync();
            return true;

        }

И прежде чем я вызову UpdateEbookDownloadLinkAsync, у меня есть цикл ForEach, который заканчивается этим фрагментом кода:

 var blob = container.GetBlockBlobReference(nameWithoutExstension + "-" + guid + ".pdf");
 await blob.UploadFromFileAsync(mappedPathOut, FileMode.Open);
 ebookUrls.Add(blob.Uri.ToString());

Не могли бы вы помочь мне решить эту проблему?


person hyperN    schedule 14.10.2015    source источник
comment
Пожалуйста, добавьте еще немного кода — нам нужно увидеть код вокруг плохой строки, где вы получаете сообщение об ошибке. Проблема, вероятно, вызвана чем-то до или, возможно, после этой строки. Однако сообщение об ошибке имеет смысл — вам не нужно ждать завершения сохранения базы данных, прежде чем вернуть значение true — константу, не зависящую от предыдущих операций. Завершите код и верните true или false в зависимости от того, было ли сохранение успешным, посмотрите, поможет ли это.   -  person Jasmine    schedule 14.10.2015
comment
Эй, я только что добавил это утверждение в качестве теста, потому что я не был уверен, в чем была ошибка, я добавлю код, как только удалю столько нерелевантных строк, сколько смогу, потому что происходит много всего.   -  person hyperN    schedule 14.10.2015
comment
Вы не ожидаете один из ваших асинхронных методов. Скорее всего тот, который заканчивается вызовом UpdateEbookDownloadLinkAsync (и этого кода нет в посте)   -  person Alexei Levenkov    schedule 14.10.2015
comment
Пожалуйста, не удаляйте строки, которые вы считаете неактуальными. Они могут быть актуальны. В конце концов, вы признаете, что не понимаете проблемы, верно? Это может быть много кода, это нормально. Суть в том, что вы возвращаетесь из своей функции, пока какая-то операция еще не завершена - я думаю, что это сохранение базы данных, которое все еще не завершено. Если вы хотите выстрелить и забыть об этом сохранении, и вам все равно, сработает оно или нет, это не так. См. это - stackoverflow.com/questions/28805796/   -  person Jasmine    schedule 14.10.2015
comment
@AlexeiLevenkov, Эй, эта строка есть в сообщении: var r = await _purchaseService.UpdateEbookDownloadLinkAsync(resultOfAdding.Id, ebookUrls); и это единственный раз, когда я звоню   -  person hyperN    schedule 14.10.2015
comment
@Jasmine, @AlexeiLevenkov, спасибо за помощь, но мне удалось найти решение, проблема заключалась в моем методе, внутри которого вызывался UpdateEbookDownloadLinkAsync, он был объявлен так: public async void Pay(), но когда я изменил его на: public async Task<bool> Pay(), он сработал   -  person hyperN    schedule 14.10.2015
comment
Итак, проблема была в коде, который вы не опубликовали. Видишь, что я имею в виду?   -  person Jasmine    schedule 14.10.2015
comment
Да, вы были полностью правы! Большое спасибо за вашу помощь :)   -  person hyperN    schedule 14.10.2015