我的代码中的自定义线程?

时间:2017-08-07 09:12:39

标签: c# multithreading threadpool

我需要创建一个抓取网站的程序。 我确实使用Thread来解决。

示例:

我有100页,我需要除它,而不是得到每个页面我需要自定义线程号来获取页面:

    2 threads - 50 pages/thread

    4 threads - 25 pages/thread

我在下面尝试了我的代码,但是当每个线程的最后一页非常慢时。

在我问之前我曾经找到解决的方法,但我不能,所以我需要帮助。

int so_thread = 10;//thread number
int page_du = 0;
List<NameValueCollection> List_item = new List<NameValueCollection>();

Thread[] threads = new Thread[so_thread];
int dem = 0;

await Task.Run(() =>
{
    for (int i = 1; i <= so_thread; i++)
    {
        if ((Int32.Parse(o_sopage.Text) % so_thread) != 0 && i == so_thread)
        {
            page_du = Int32.Parse(o_sopage.Text) % so_thread;//Int32.Parse(o_sopage.Text) == page number need get
        }

        threads[i - 1] = new Thread((object data) =>
        {
            Array New_Data = new object[2];
            New_Data = (Array)data;
            int _i = (int)New_Data.GetValue(0);
            int _pagedu = (int)New_Data.GetValue(1);
            int page_per_thread = Int32.Parse(o_sopage.Text) / so_thread;//Int32.Parse(o_sopage.Text) == page number need get

            for (int j = ((page_per_thread * _i) - page_per_thread) + 1; j <= ((page_per_thread * _i) + _pagedu); j++)
            {
                //MessageBox.Show(j.ToString());
                var TG = ebay.GetPage(j);
                lock (List_item)
                {
                    List_item.AddRange(TG);
                    dem++;
                    progressBar1.Invoke((MethodInvoker)delegate
                    {
                        progressBar1.Value = dem;
                    });
                }
            }
        });
        object DATA = new object[2] { i, page_du };
        threads[i - 1].Start(DATA);
    }
});

1 个答案:

答案 0 :(得分:0)

使用Parallel.ForEach而不是自己创建线程。

Parallel.ForEach(yourCollection, () => { /* your code here */});