C# Task Parallel ForEach 管理一个 class 的多个实例

C# Task Parallel ForEach manage multiple instances of a class

class Program
{
    static void Main(string[] args)
    {
        ChromeDriver chromeDriver = null;
        Console.WriteLine("Hello World!");
        List<string> Urls = new List<string>() {
            "https://www.google.com",
            "https://www.facebook.com",
            "https://www.youtube.com",
            "https://www.gmail.com",
            "https://www.linkedin.com"
        };

        ChromeOptions chromeOptions = new ChromeOptions()
        {
            PageLoadStrategy = PageLoadStrategy.Normal
        };

        //options.AddArgument("headless");
        chromeOptions.AddArguments("disable-geolocation", "start-maximized", "disable-infobars");
        chromeOptions.AcceptInsecureCertificates = true;
        chromeOptions.LeaveBrowserRunning = true;


        Parallel.ForEach(Urls, url =>
        {
            chromeDriver = new ChromeDriver(AppDomain.CurrentDomain.BaseDirectory, chromeOptions, new TimeSpan(0, 0, 60));
            chromeDriver.Url = url;
            TestClass testClass = new TestClass(chromeDriver);
            testClass.test();

        });

        Console.ReadKey();
    }


}

public class TestClass
{
    IWebDriver driver;
    public TestClass(OpenQA.Selenium.Chrome.ChromeDriver driver)
    {
        this.driver = driver;
    }

    public void test()
    {
        Console.WriteLine(this.driver.Url);

    }
}

上面的代码产生了什么:

虽然我想在那里拥有所有不同的 5 个网址。但它显示了最后执行的网站。我在这里错过了什么?

在第 5 行声明 ChromeDriver chromeDriver = null; 会创建一个 单一 变量作用域为 Main 方法。

第 28 行的 chromeDriver = new ChromeDriver(... 调用 创建一个 new 实例,但将其分配给先前在 enclosing 作用域(即第 5 行)中声明的变量。因此,回调中的每个赋值都会覆盖所有其他回调执行的赋值。

你想做的是

  • 移除ChromeDriver chromeDriver = null;
  • chromeDriver = new ChromeDriver 替换为 var chromeDriver = new ChromeDriver,从而创建一个作用域为回调而不是 Main 方法的实例。