C# 多线程代理检查器

标签 c# multithreading listview backgroundworker

所以遇到了一个新问题......

我正在用 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/

相关文章:

c# - 如何创建 Gmail API 消息

java - 前进 ListView 下一项/setSelectionFromTop 不起作用/禁止用户滚动 ListView

c# - 托盘图标的 Windows 10 任务栏颜色检测

c# - Tuple<List<string>,List<string>> 在调用 .AddRange 时给出 NullReferenceException

c# - 尝试从另一个线程访问复杂对象时出现 InvalidOperationException

java - 在 Java 中检查新 XML 文件的最佳方法

android - 似乎无法同时显示 ListView 和 AdView

listview - 如何同步singlechildscrollview和listview flutter的滚动?

c# - 为什么定义接口(interface)的方法和属性前面没有修饰符(public、private、protected)?

javascript - 如何在 Web Worker 中对对象进行编码,以便通过 postMessage 传递?