C#多线程重复

时间:2015-09-18 03:39:04

标签: c# multithreading

我试图制作一个工具,从我提供的许多网址中获取源字符串。我将此代码用于多线程

\n

它运行得非常顺利,直到我检查结果并且有一些重复的结果并且丢失了我提供的一些网址,如果为许多网址使用较少的线程(10个线程 - 20个网址)但是没有问题使用20个线程20个网址。

请帮帮我。谢谢。

1 个答案:

答案 0 :(得分:2)

if (i <= urllist.Count - 1)
{
    var thread = new Thread(() =>
    {
         string source = GetSource(urllist[i]);
         SaveToFile(source, i + ".txt"); 
    });
    thread.Start();
    i++;
    nowworker += 1;
}

i更新(i++)之前,无法保证您传递给线程的方法。事实上, 。这意味着多个线程可能使用相同的i值,而i的某些值将不会有任何线程执行它。

更糟糕的是,GetSource可能会使用与i不同的SaveToFile值。

请在此处阅读:http://jonskeet.uk/csharp/csharp2/delegates.html

这将解决它:

if (i <= urllist.Count - 1)
{
    var currentIndex = i;
    var thread = new Thread(() =>
    {
         string source = GetSource(urllist[currentIndex]);
         SaveToFile(source, currentIndex + ".txt"); 
    });
    thread.Start();
    i++;
    nowworker += 1;
}

更好的是,您可以用以下代码替换整个代码块:

Parallel.For(0, urlList.Count - 1, 
    new ParallelOptions { MaxDegreeOfParallelism = threads }, 
    i =>
    {       
        string source = GetSource(urllist[i]);
        SaveToFile(source, i + ".txt");
    }
);

哪个将摆脱代码臭Thread.Sleep()并让.NET管理为您启动线程