我在线程和队列方面遇到了一些问题,我将直接进入代码并确定我遇到的问题,也许还有一些我尚未注意到的问题。
列表/队列-
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
但是,当我手动检查是否已处理所有字符串时,它仅处理了一半或四分之一的字符串。因此,我不得不在单独的执行中重新处理其余的字符串,有时要多次处理,直到整个字符串列表已得到相应处理。