C#线程安全队列

时间:2019-06-11 18:30:30

标签: c# multithreading queue

我在线程和队列方面遇到了一些问题,我将直接进入代码并确定我遇到的问题,也许还有一些我尚未注意到的问题。

列表/队列-

public static Queue<string> queue;

queue = new Queue<string>(System.IO.File.ReadAllText("strings.txt").Split(new char[] { '\n' }));

线程-

        SemaphoreSlim maxThread = new SemaphoreSlim(500);

        for (int i = 0; i < 500; i++)
        {
            maxThread.Wait();
            Task.Factory.StartNew(() =>
            {
                Search();
            }
                , TaskCreationOptions.LongRunning)
            .ContinueWith((task) => maxThread.Release());
        }

因此,我设置了500个线程来执行搜索功能。

搜索-

while(queue.Count > 0)
{
    string searchstring;

    Queue<string> queue2;
    lock(queue2 = queue)
    {
        searchstring = queue.Dequeue().Trim();
    }

    try
    {

        string result = send(searchstring);

        if(searchstring.Contains("Failed")
        {
            lock (queue2 = queue)
            {
                queue.Enqueue(combos);
            }
            continue;
        }

        if(result.Contains("Success")
        {
            Console.WriteLine("String was found");
        }

    }
}

现在绝对不是最好的解决方案或方法,但是我对使用Queue还是陌生的。

关于问题,我注意到的是,如果我的列表已处理并且队列中剩余的项目少于其自身的线程,则这些线程开始使用重复的字符串,因此例如

queue.Count = 10; // 10 strings left to process

但是有500个线程在运行,这些线程将开始处理相同的字符串,直到没有剩下的为止,

 Thread1 is using " Example1 "
 Thread2 is using " Example2 "
 etc...
 Thread 11 is using " Example1 "
 Thread 12 is using " Example2 "
 etc...

最终,同一字符串已被多个线程处理

例如,我不确定是否要使用队列和线程正确地添加和删除甚至处理字符串

//Console.exe - output
Processed 1000 strings
Strings left = 0;
Finished

但是,当我手动检查是否已处理所有字符串时,它仅处理了一半或四分之一的字符串。因此,我不得不在单独的执行中重新处理其余的字符串,有时要多次处理,直到整个字符串列表已得到相应处理。

0 个答案:

没有答案