管理和控制线程
本文关键字:线程 控制线 控制 管理 | 更新日期: 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();
}
也就是说,我不包括你在这里试图做什么,但多线程是危险的。即使您的计数分配正确,您的线程也有可能做更糟糕的事情。