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 loop ซึ่งลงท้ายด้วยโค้ดชิ้นนี้:

 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
โปรดเพิ่มโค้ดอีก - เราจำเป็นต้องดูโค้ดที่อยู่บริเวณบรรทัดที่ไม่ถูกต้องซึ่งคุณได้รับข้อผิดพลาด ปัญหาน่าจะเกิดจากบางสิ่งก่อนหรือหลังบรรทัดนั้น ข้อความแสดงข้อผิดพลาดนั้นสมเหตุสมผล - คุณไม่จำเป็นต้องรอให้บันทึกฐานข้อมูลเสร็จสิ้นก่อนที่จะคืนค่าจริง - ค่าคงที่ไม่ขึ้นอยู่กับการดำเนินการก่อนหน้า กรอกโค้ดและส่งคืนค่าจริงหรือเท็จโดยขึ้นอยู่กับว่าบันทึกสำเร็จหรือไม่ ดูว่าจะช่วยได้หรือไม่   -  person Jasmine    schedule 14.10.2015
comment
เฮ้ ฉันเพิ่งเพิ่มคำสั่งนั้นเป็นแบบทดสอบ เพราะฉันไม่แน่ใจว่าเกิดข้อผิดพลาดอะไร ฉันจะเพิ่มโค้ดทันทีที่ฉันลบบรรทัดที่ไม่เกี่ยวข้องออกให้ได้มากที่สุด เนื่องจากมีเรื่องเกิดขึ้นมากมาย   -  person hyperN    schedule 14.10.2015
comment
คุณไม่ได้รอวิธี Async อย่างใดอย่างหนึ่งของคุณ เป็นไปได้มากว่าจะเรียก 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