2016-08-01 1 views
2

У меня есть этот код:Как ограничить нити, работающие в C# Селен

foreach (var s in linesTxt) 
{ 
    if (!myList.Contains(s)) 
    { 
     myList.Add(s); 
     if (!String.IsNullOrWhiteSpace(s)) 
     { 
      Processor(s); 
     } 
    } 
} 

который получает все детали в одном файле .txt, один данные в каждой строке.

Это часть резьбы:

public void Processor(string Sample) 
{ 
    //Process p = Process.GetCurrentProcess(); 
    ThreadStart Thread1 = new ThreadStart(() => firstFunc(Sample)); 
    ThreadStart Thread2 = new ThreadStart(() => secondFunc(Sample)); 
    ThreadStart Thread3 = new ThreadStart(() => thirdFunc(Sample)); 
    ThreadStart Thread4 = new ThreadStart(() => fourthFunc(Sample)); 
    ThreadStart Thread5 = new ThreadStart(() => fifthFunc(Sample)); 
    ThreadStart Thread6 = new ThreadStart(() => sixthFunc(Sample)); 
    ThreadStart Thread7 = new ThreadStart(() => seventhFunc(Sample)); 
    ThreadStart Thread8 = new ThreadStart(() => eightFunc(Sample)); 
    ThreadStart Thread9 = new ThreadStart(() => ninthFunc(Sample)); 
    ThreadStart Thread10 = new ThreadStart(() => tenthFunc(Sample)); 
    ThreadStart Thread11 = new ThreadStart(() => eleventhFunc(Sample)); 
    ThreadStart Thread12 = new ThreadStart(() => twelveFunc(Sample)); 
    ThreadStart Thread13 = new ThreadStart(() => thirteenFunc(Sample)); 
    Thread[] mainThread = new Thread[13]; 
    mainThread[0] = new Thread(Thread1); 
    mainThread[1] = new Thread(Thread2); 
    mainThread[2] = new Thread(Thread3); 
    mainThread[3] = new Thread(Thread4); 
    mainThread[4] = new Thread(Thread5); 
    mainThread[5] = new Thread(Thread6); 
    mainThread[6] = new Thread(Thread7); 
    mainThread[7] = new Thread(Thread8); 
    mainThread[8] = new Thread(Thread9); 
    mainThread[9] = new Thread(Thread10); 
    mainThread[10] = new Thread(Thread11); 
    mainThread[11] = new Thread(Thread12); 
    mainThread[12] = new Thread(Thread13); 
    foreach (Thread myThread in mainThread) 
    { 
     //ThreadPool.SetMaxThreads(26, 26); 
     //p.Refresh(); 
     //Console.WriteLine("Before start: {0}", p.Threads.Count); 
     myThread.Start(); 
    } 
} 

firstFunc, secondFunc .... содержит селен, C# код.

Примечание: Я уже пробовал использовать ThreadPool.SetMaxThreads, но это не удалось.

Например, если файл txt содержит 20 данных, тогда мой компьютер не будет отвечать, но если он содержит только 5 или меньше, он работает, даже если я испытываю некоторые задержки.

Я хочу, чтобы обрабатывать любое количество данных в txt-файле.

Обновлено

firstFunc содержит следующее:

    var driverService1 = PhantomJSDriverService.CreateDefaultService(); 
        driverService1.HideCommandPromptWindow = true; 
        var driver1 = new PhantomJSDriver(driverService1); 
        driver1.Navigate().GoToUrl("http://sample.com"); 
        driver1.FindElement(By.Id("urlInput")).SendKeys(Domain); 
        driver1.FindElement(By.ClassName("convert-url")).Click(); 
        var wait1 = new WebDriverWait(driver1, TimeSpan.FromSeconds(10)); 
        wait1.Until(ExpectedConditions.ElementExists(By.XPath("//*[@class='alert alert-success alert-dismissible fade in']//p//input"))); 
        System.Threading.Thread.Sleep(2000); 
        val1 = driver1.FindElement(By.XPath("//*[@class='alert alert-success alert-dismissible fade in']//p//input")).GetAttribute("value"); 
        if (Results.InvokeRequired) 
        { 
         Results.Invoke(new MethodInvoker(delegate { Results.Items.Add(DomainSearch + " => " + "http://sample.com => " + val1); })); 
        } 
        driver1.Quit(); 
        driverService1.Dispose(); 
+0

Каковы каждый из 'firstFunc',' secondFunc' и т. Д.? Возвращают ли они значение (учитывая, что они содержат 'Func' в имени) или они просто делают действие? – Enigmativity

+0

Итак, вы возвращаете материал. Все ли такие функции? – Enigmativity

+0

Они все одинаковые – jt25

ответ

1

Вы могли бы просто использовать Parallel:

var options = new ParallelOptions(); 
options.MaxDegreeOfParallelism = 5; 

Parallel.Invoke(options, 
() => firstFunc(Sample), 
() => secondFunc(Sample), 
() => thirdFunc(Sample), 
    ... 
); 

Или Task.Factory:

ThreadPool.SetMaxThreads(5, 1000); 

Task[] tasks = new Task[3] { 
    Task.Factory.StartNew(() => firstFunc(Sample)), 
    Task.Factory.StartNew(() => secondFunc(Sample)), 
    Task.Factory.StartNew(() => thirdFunc(Sample)), 
    ... 
}; 

Task.WaitAll(tasks); 
+0

Это весь код, который мне нужен для его реализации с помощью Parallel? – jt25

+0

Да, с Parallel или Task.Factory нет необходимости иметь дело с потоками. –

+0

Я думаю, что мой единственный выбор - использовать потоки, потому что он очень медленный, даже если я использую только одни данные. – jt25

 Смежные вопросы

  • Нет связанных вопросов^_^