Masalah asinkron saat mengubah metode untuk menggunakan koleksi

Saya punya metode seperti itu:

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

Ini bekerja dengan cukup baik.

Lalu saya memutuskan untuk mengubahnya sedikit:

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;
}

Dan sekarang saya mendapat masalah, entah kenapa hasilnya tidak kembali. Untuk pemahaman saya, saya mengalami kebuntuan.

Apakah Anda tahu cara memperbaikinya?


person sreginogemoh    schedule 17.04.2014    source sumber
comment
kemungkinan duplikat Apakah mungkin untuk menunggu pengembalian hasil DoSomethingAsync()   -  person Fals    schedule 17.04.2014
comment
@Fals, sepertinya tidak ada hubungannya. Dia tidak menggunakan hasil.   -  person Matt Smith    schedule 17.04.2014
comment
Jika Anda memposting contoh kecil namun lengkap yang mereproduksi masalah tersebut, kami dapat membantu Anda dengan lebih baik.   -  person Matt Smith    schedule 17.04.2014
comment
Jeda debugger untuk melihat apa yang ada di tumpukan. Apakah eksekusi dihentikan? Mungkin beberapa kode pemblokiran di GetResult.   -  person usr    schedule 17.04.2014
comment
Metode pertama Anda bahkan tidak dapat dikompilasi, jadi mengapa Anda mengatakan itu berhasil?   -  person svick    schedule 17.04.2014
comment
Ini tidak terlihat seperti jalan buntu, coba masukkan daftar satu url saja dan lihat apa yang terjadi.   -  person NeddySpaghetti    schedule 18.04.2014


Jawaban (2)


Tambahkan ConfigureAwait(false) agar tidak terjadi kebuntuan pada 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

Cobalah ini:

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

to

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

Seringkali menggunakan async dan menunggu dapat membingungkan (setidaknya bagi saya) dan akan memberikan hasil yang saya tidak yakin. Ini adalah hal pertama yang saya tukar ketika saya mengalami masalah.

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

person Ian P    schedule 17.04.2014
comment
Saya tidak berpikir bahwa pemrograman pemujaan kargo (“Saya tidak tahu apa fungsinya, tetapi ini berhasil untuk saya sekali, jadi mungkin juga berhasil untuk Anda, meskipun situasinya berbeda”) adalah praktik yang baik. Dan saya tidak melihat alasan mengapa perubahan ini dapat membantu di sini. - person svick; 17.04.2014