ปัญหา Async เมื่อเปลี่ยนวิธีการใช้คอลเลกชัน

ฉันมีวิธีการเช่นนั้น:

public async Task<IEnumerable<Model>> Get(string link)
{
   MyRequestAsync request = new MyRequestAsync(link);
   return await request.GetResult();
}

มันทำงานได้ค่อนข้างดี

จากนั้นฉันตัดสินใจเปลี่ยนสิ่งนี้เล็กน้อย:

public async Task<IEnumerable<Model>> Get([FromUri]IList<string> links)
{
    IList<Model> list = new List<Model>();
    foreach (var link in links)
    {
        MyRequestAsync request = new MyRequestAsync(link);
        list.Add(await request.GetResult());
    }

    return list;
}

และตอนนี้ฉันมีปัญหา ด้วยเหตุผลบางอย่างมันแค่ไม่ส่งคืนผลลัพธ์ เพื่อความเข้าใจของฉัน ฉันกำลังประสบปัญหาการหยุดชะงัก

คุณรู้วิธีแก้ไขปัญหานั้นหรือไม่?


person sreginogemoh    schedule 17.04.2014    source แหล่งที่มา
comment
เป็นไปได้ที่ซ้ำกันของ เป็นไปได้หรือไม่ที่จะรอผลตอบแทนผลตอบแทน DoSomethingAsync()   -  person Fals    schedule 17.04.2014
comment
@Fals ดูเหมือนจะไม่เกี่ยวข้อง เขาไม่ได้ใช้ผลผลิต   -  person Matt Smith    schedule 17.04.2014
comment
หากคุณโพสต์ตัวอย่างเล็กๆ น้อยๆ แต่ครบถ้วนสมบูรณ์ซึ่งทำให้เกิดปัญหาซ้ำ เราจะสามารถช่วยคุณได้ดีขึ้น   -  person Matt Smith    schedule 17.04.2014
comment
หยุดดีบักเกอร์ชั่วคราวเพื่อดูว่ามีอะไรอยู่ในสแต็ก การประหารชีวิตหยุดลงหรือไม่? อาจมีรหัสบล็อกอยู่ใน GetResult   -  person usr    schedule 17.04.2014
comment
วิธีแรกของคุณไม่สามารถคอมไพล์ได้ แล้วทำไมคุณถึงบอกว่ามันได้ผล?   -  person svick    schedule 17.04.2014
comment
ดูเหมือนจะไม่เกิดการหยุดชะงัก ลองส่งรายการ URL เดียวแล้วดูว่าเกิดอะไรขึ้น   -  person NeddySpaghetti    schedule 18.04.2014


คำตอบ (2)


เพิ่ม ConfigureAwait(false) เพื่อไม่เกิดการหยุดชะงักใน UI Thread

public async Task<IEnumerable<Model>> Get([FromUri]IList<string> links)
{
  IList<Model> list = new List<Model>();
  foreach (var link in links)
 {
     MyRequestAsync request = new MyRequestAsync(link);
     list.Add(await request.GetResult().ConfigureAwait(false));
}

return list;
person Yuval Itzchakov    schedule 17.04.2014

ลองดูสิ่งนี้:

IList<Model> list = new List<Model>();

to

ConcurrentBag<Model> list = new ConcurrentBag<Model>();

บ่อยครั้งการใช้ async และ await อาจทำให้เกิดความสับสน (อย่างน้อยสำหรับฉัน) และจะให้ผลลัพธ์ที่ฉันไม่แน่ใจ นี่เป็นสิ่งแรกที่ฉันเปลี่ยนเมื่อมีปัญหา

http://msdn.microsoft.com/en-us/library/dd381779%28v=vs.110%29.aspx

person Ian P    schedule 17.04.2014
comment
ฉันไม่คิดว่าการเขียนโปรแกรมเกี่ยวกับลัทธิการขนส่งสินค้า (“ฉันไม่รู้ว่าสิ่งนี้ทำอะไร แต่มันได้ผลสำหรับฉันครั้งหนึ่ง ดังนั้นมันอาจได้ผลสำหรับคุณเช่นกัน แม้ว่าสถานการณ์จะแตกต่างออกไป”) ถือเป็นแนวปฏิบัติที่ดี และฉันไม่เห็นเหตุผลว่าทำไมการเปลี่ยนแปลงนี้จึงจะช่วยได้ที่นี่ - person svick; 17.04.2014