Memaksimalkan penggunaan loop Parallel.For atau Parallel.Foreach

Saya memiliki struktur pernyataan Parallel.For dan PLINQ bersarang di aplikasi konsol kecil saya yang pada dasarnya melakukan operasi terikat jaringan (melakukan permintaan http) seperti berikut:

daftar pengguna diisi dari DB lalu saya melakukan hal berikut:

Parallel.For(0,users.count(), index=>{

// here I try to perform HTTP requests for multiple users

});

Kemudian di dalam loop for ini saya melakukan pernyataan plinq untuk mengambil info pengguna ini melalui permintaan HTTP.

Sehingga sekarang total saya mendapatkan dua loop bersarang seperti berikut:

Parallel.For(0,users.count(), index=>{

// Some stuff is done before the PLINQ statement is called... 
newFilteredList.AsParallel().WithDegreeOfParallelism(60).ForAll(qqmethod =>
    {
        var xdocic = new XmlDocument();
        xdocic.LoadXml(SendXMLRequestToEbay(null, null, qqmethod.ItemID, true, TotalDaysSinceLastUpdate.ToString(), null));
        int TotalPages = 0;
        if (xdocic.GetElementsByTagName("TotalNumberOfPages").Item(0) != null)
        {
            TotalPages = Convert.ToInt32(xdocic.GetElementsByTagName("TotalNumberOfPages").Item(0).InnerText);
        }
        if (TotalPages > 1)
        {
            for (int i = 1; i < TotalPages + 1; i++)
            {
                Products.Add(SendXMLRequestToEbay(null, null, qqmethod.ItemID, false, TotalDaysSinceLastUpdate.ToString(), i.ToString()));
            }
        }
        else
        {
            Products.Add(SendXMLRequestToEbay(null, null, qqmethod.ItemID, false, TotalDaysSinceLastUpdate.ToString(), "1"));
        }
    });
});

Saya mencoba menggunakan loop for luar seperti yang biasa, dan saya perhatikan bahwa kinerjanya jauh lebih cepat dan lebih baik daripada seperti ini.

Yang paling membuat saya khawatir di sini adalah saya memeriksa pemanfaatan CPU saat menjalankan aplikasi konsol seperti ini, selalu sekitar 0,5-3% dari total daya CPU...

Jadi cara saya mencoba melakukan permintaan HTTP adalah seperti ini:

15 pengguna sekaligus * jumlah permintaan HTTP untuk 15 pengguna tersebut.

Apa yang saya lakukan salah di sini?


person User987    schedule 31.01.2017    source sumber
comment
Kelas Paralel bukan untuk pekerjaan yang tidak terikat CPU. Permintaan HTTP terikat pada I/O. Juga apa jenis Products, jika itu hanya List<T> kelas itu tidak aman untuk thread dan Anda merusak kelas saat Anda menulisnya dengan beberapa thread secara bersamaan.   -  person Scott Chamberlain    schedule 01.02.2017
comment
@ScottChamberlain Apa saran Anda agar saya mengganti loop for luar pertama dengan then ? Saya ingin dapat memproses 15 dan mengirim 15 permintaan http secara bersamaan untuk para pengguna tersebut, bagaimana saya bisa melakukannya?   -  person User987    schedule 01.02.2017
comment
@ScottChamberlain Produknya bersamaan =)   -  person User987    schedule 01.02.2017
comment
Gunakan Aliran data sebaliknya, Anda dapat memiliki dua blok dalam satu rantai, satu untuk mengirim permintaan, satu untuk diproses, Anda dapat mengatur tingkat paralelisme maksimal untuk setiap blok.   -  person Scott Chamberlain    schedule 01.02.2017
comment
@ScottChamberlain bisakah Anda membantu saya sedikit dalam hal ini? Bagaimana saya menulis contoh praktis untuk kasus khusus saya ini?   -  person User987    schedule 01.02.2017
comment
Lihat paruh kedua jawaban lama saya ini, memiliki dua blok, satu yang mendapatkan catatan secara paralel kemudian satu lagi yang memproses catatan tersebut satu per satu untuk menambahkannya ke daftar. Anda dapat mengubah blok ke-2 untuk melakukan pemrosesan yang Anda perlukan dan mengaturnya ke tingkat paralel yang lebih tinggi dari 1.   -  person Scott Chamberlain    schedule 01.02.2017
comment
Catatan tambahan: jumlah Parallel.xxx panggilan tidak akan mengubah konfigurasi jaringan... Anda mungkin lebih tertarik pada stackoverflow.com/questions/1361771/   -  person Alexei Levenkov    schedule 01.02.2017