所以遇到了一个新问题......
我正在用 C# 编写多线程代理检查器。
我正在使用 BackgroundWorkers 来解决多线程问题。
但是我在协调和分配留在队列中的代理给正在运行的工作人员时遇到了问题。它大部分时间都有效,但有时不会返回任何结果,因此一些代理会在此过程中“丢失”。
此列表表示队列,并填充了 ListView 中代理的 ID。
private List<int> queue = new List<int>();
private int GetNextinQueue()
{
if(queue.Count > 0)
{
lock (lockqueue)
{
int temp = queue[0];
queue.Remove(temp);
return temp;
}
}
else
return -1;
}
以上是我在队列中获取下一个代理的方法,我正在使用 lock 语句来防止竞争条件,但我不确定它是否足够或者它是否会减慢进程,因为它会让其他线程等待... (lockqueue是一个只是用来加锁的对象)
所以我的问题是,一些代理怎么可能没有得到检查(即使 ping 失败检查应该返回一些东西,但有时什么也没有)我如何优化这段代码以提高性能?
这是我认为对这个问题很重要的其余代码 http://pastebin.com/iJduX82b
如有遗漏请留言
谢谢:)
最佳答案
queue.Count 的检查应该在 lock 语句中执行。 Otberwise 你可能会检查 queue.Count > 0,但是当你能够进入锁时,另一个线程可能已经从队列中删除了一个项目,然后你将在一个可能为空的队列上调用 Remove。
您可以将其修改为:
private int GetNextinQueue()
{
lock (lockqueue)
{
if(queue.Count > 0)
{
int temp = queue[0];
queue.Remove(temp);
return temp;
}
else
return -1;
}
}
基本上,如果您想使用锁来保护对数据结构的访问,请确保保护对该结构的所有读取和写入以确保线程安全。
关于C# 多线程代理检查器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3132178/