C#任务并行ForEach管理一个类的多个实例

时间:2019-05-07 16:20:01

标签: c# selenium-webdriver task-parallel-library

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);

    }
}

上面的代码产生了什么:

enter image description here

尽管我想在那里设置所有5个不同的URL。但显示最后执行的网站。我在这里想念什么?

1 个答案:

答案 0 :(得分:4)

在第5行上声明ChromeDriver chromeDriver = null;,将创建一个范围为Main方法的单个变量。

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

你想做的是

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