管理和控制线程

本文关键字:线程 控制线 控制 管理 | 更新日期: 2023-09-27 18:22:11

此代码(对这个可怕的代码感到抱歉):

int count = 0;
while (true)
{
    if (count < 3)
    {
        try
        {
            ac = acci.Pop();
        }
        catch
        {
            break;
        }
        if (ac != "")
        {
            ++count;
            new Thread(delegate() 
                       {
                         Console.WriteLine("Run " + ac.Name);
                         Go(ac);
                         --count;
                       }).Start();
        }
    }
}

在Go()中,我使用的是WebClient。当我运行它时,同一个线程运行了1次以上,但这不应该发生。ac-String,count-Int,在Go()Web客户端下载页面中,解析一些标记并将标记值保存在文件中。只需要同时运行3个线程。

管理和控制线程

我看到的最简单的变化就是更改计数的定义:

volatile int count = 0;

这使得不同的线程都使用相同的"int"变量,而如果没有它,它们可能会有不同的副本。

然而,我认为你需要更多的改变。Int不用于线程同步。这就是信号量的作用:

Semaphore sem = new Semaphore(3,3);
while (acci.Count > 0)
{
     ac = acci.Pop();
     if (ac != "")
     {
         new Thread(delegate() 
                   {
                     sem.WaitOne();
                     Console.WriteLine("Run " + ac.Name);
                     Go(ac);
                     sem.Release();
                   }).Start();
     }
}

不过要小心!!!我们可以在那里创建很多线程!如果你的系统可以一次得到很多请求,你可能想把WaitOne移到新线程之外(…)。

您可能还需要查看ThreadPool类和BackgroundWorker类,具体取决于您的环境。

我不知道你的ac是什么,但你有while(true){},这是一个无限循环。它只会在ac变量赋值出现异常时中断。这很糟糕。不要使用try/catch来实现应用程序逻辑。生成异常对您的代码来说是一件大事。对于这类事情,您应该使用if/else语句。例如

if (acci.length == 0)
{
    break;
}
else
{
    ac = acci.Pop();
}

也就是说,我不包括你在这里试图做什么,但多线程是危险的。即使您的计数分配正确,您的线程也有可能做更糟糕的事情。