多线程问题,说它在任务尚未完成之前完成



我已经编写了一个void来处理硒网络浏览的多个线程。现在的问题是,例如,如果我输入4个任务和2个线程。该程序表示,当它完成两项任务时,它就完成了。

编辑:基本上,我希望程序等待任务完成。我还希望,如果一个线程完成了,但另一个线程正在运行,并且有任务要做,它会直接启动另一个任务,而不是等待第二个线程完成。

感谢和抱歉的代码,使它很快显示为一个例子,它是如何的。

{
static void Main(string[] args)
{
Threads(4, 4);
Console.WriteLine("Program has finished");
Console.ReadLine();
}
static Random ran = new Random();
static int loop;
public static void Threads(int number, int threads)
{
for (int i = 0; i < number; i++)
{
if (threads == 1)
{
generateDriver();
}
else if (threads > 1)
{
start:
if (loop < threads)
{
loop++;
Thread thread = new Thread(() => generateDriver());
thread.Start();
}
else 
{
Task.Delay(2000).Wait();
goto start;
}
}
}
}

public static void test(IWebDriver driver)
{
driver.Navigate().GoToUrl("https://google.com/");
int timer = ran.Next(100, 2000);
Task.Delay(timer).Wait();
Console.WriteLine("[" + DateTime.Now.ToString("hh:mm:ss") + "] - " + "Task done.");
loop--;
driver.Close();
}
public static void generateDriver()
{
ChromeOptions options = new ChromeOptions();
options.AddArguments("--disable-dev-shm-usage");
options.AddArguments("--disable-extensions");
options.AddArguments("--disable-gpu");
options.AddArguments("window-size=1024,768");
options.AddArguments("--test-type");
ChromeDriverService service = ChromeDriverService.CreateDefaultService(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
service.HideCommandPromptWindow = true;
service.SuppressInitialDiagnosticInformation = true;
IWebDriver driver = new ChromeDriver(service, options);
test(driver);
}

手动跟踪正在运行的线程,等待它们完成并重用已经完成的线程并非易事
但是,.NET运行时提供现成的解决方案,您应该更喜欢自己处理
实现所需结果的最简单方法是使用Parallel.For循环并设置MaxDegreeOfParallelism,例如:

public static void Threads(int number, int threads)
{
Parallel.For(0, number,
new ParallelOptions { MaxDegreeOfParallelism = threads },
_ => generateDriver());
}

如果你真的想手动完成,你需要使用Thread(或Task(的数组,并不断对它们进行迭代,检查它们是否已经完成,以及它们是否用新线程替换了它们。这需要比Parallel.For解决方案多一点的代码(而且不太可能执行得更好(

最新更新