【发布时间】:2020-04-21 21:02:26
【问题描述】:
我编写了一个 void 来处理 selenium 网页浏览的多个线程。问题是现在,例如,如果我输入 4 个任务和 2 个线程。程序在完成 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);
}
【问题讨论】:
-
我添加了代码@LarsTech
-
您使用
Thread而不是Task有什么原因吗?对于任务,您只需调用Task.WaitAll -
另外你为什么使用
goto而不是第二个for循环? -
@UnholySheep 如果我有更多任务,我认为我不能使用 waitall?我想我之前尝试过,但没有成功。
-
我尝试了很多方法,例如添加另一个 for 循环,但结果出现了其他问题。
标签: c# multithreading task