2015-02-06 6 views
2

У меня есть два приложения .NET. Один из них представляет собой автономное консольное приложение, которое запускает несколько экземпляров второго приложения, передавая каждый другой массив аргументов. Я запускаю второе приложение, используя Process.Start.Запуск нескольких экземпляров одного и того же приложения с использованием многопоточности .NET.

Мне нужно убедиться, что каждый экземпляр приложения имеет собственное пространство в памяти, и я думаю о создании нового потока для запуска каждого приложения. Я довольно новичок в многопоточности и задавался вопросом, является ли это хорошей практикой? Есть ли лучший способ сделать это? Может ли несколько экземпляров одного и того же приложения работать бок о бок без каких-либо проблем? Буду признателен за любую помощь. благодаря!

Ниже приведен неполный код от запускающего приложения: arr - массив, содержащий несколько строковых значений. Приведенный ниже код принимает эти значения с шагом, равным iCount, помещает их в массив темпа - arrTemp и передает его на вторую программу:

i = 0 

While (i <= arr.Count - 1) 
    j = 0 
    ReDim arrTemp(iCount-1) 
    While j < iCount And j < arr.Count - 1 
     arrTemp(j) = arr(i).ToString() 
     j += 1 
     i += 1 
    End While 

    'pass an array to the process as an argument 
    startInfo.Arguments = String.Join(" ", arrTemp) 
    Dim p As Process = Process.Start(startInfo) 
    p.WaitForExit() 

    'clear the array 
    ClearArray(arrTemp) 

    i = j + 1 
End While 

Я хочу, чтобы добавить многопоточность в код выше, чтобы включить приложение к икре несколько экземпляров второго приложения. Мне также нужна помощь с этим

+0

все они имеют собственное пространство в памяти, так как они работают в разных процессах. – Bond

+1

Предполагая, что второе приложение правильно использует любые общие ресурсы, просто избавьтесь от 'p.WaitForExit()', и у вас будет несколько экземпляров, запущенных ... –

+0

Idle Mind, чтобы уточнить, Process.Start выполнит работу и мне не нужно использовать многопоточность? Существуют ли преимущества создания отдельных процессов с потоками? – ElenaDBA

ответ

1

«Выполнение процессов в отдельных потоках» в качестве понятия не имеет никакого смысла. Процессы содержат потоки; А не наоборот. У процесса также есть свое «пространство в памяти» (в то время как поток не работает!), Поэтому в этом и не имеет значения.

Если вы запустили процесс с использованием Process.Start, он будет работать полностью отдельно от вашего кода (полностью вне любых потоков, к которым у вас есть доступ) и с собственным пространством памяти.

Единственная причина, по которой вам может потребоваться несколько потоков, заключается в том, что в конкретном коде, который вы отправили, вы ожидаете выхода приложения, прежде чем код сможет продолжить. Это означает, что вы блокируете поток во время запуска приложения, и по этой причине вам может потребоваться несколько потоков. (Тем не менее, вам может быть лучше переформатировать код, чтобы он работал на одном потоке.)

Что касается безопасности запуска нескольких экземпляров приложения, это зависит полностью от приложения. Двенадцать экземпляров блокнота будут работать бок о бок без проблем, но это не относится ко всем приложениям.

+0

Спасибо Dan. Я обрабатываю большое количество файлов, поэтому мое приложение (второе приложение в этом случае) работает в течение очень долгого времени. Я хочу попробовать обработать некоторые файлы одновременно, поэтому я хотел сделать это с одновременным запуском нескольких экземпляров приложения. Мой опубликованный код разбивает файлы с шагом iCount (для целей тестирования 10 или 20). Можете ли вы предложить лучший способ сделать то, что я пытаюсь сделать? Я бы очень признателен за любые советы – ElenaDBA

+0

Что-то вроде этого: вместо того, чтобы вызывать 'p.WaitForExit', где вы это делаете, добавьте все ваши' p 'в' List (Of Process) '. Затем, после вашего существующего цикла, используйте 'For Every' для вызова' .WaitForExit' для каждого процесса в вашем списке. Это позволяет сразу запускать все ваши процессы и будет ждать их завершения до продолжения. Это даст вам простое улучшение по сравнению с текущим кодом. –

1

Ну, notepad.exe может запускать несколько независимых экземпляров, а также ваше приложение. Никаких изменений не требуется. По умолчанию экземпляры изолированы друг от друга и ничего не имеют.

+0

Не могли бы вы помочь мне добавить потоки в мой цикл, чтобы несколько процессов порождались отдельно? – ElenaDBA

+1

Почему вы ждете их выхода? – usr

+0

Вы не можете гарантировать, что приложение будет запускать несколько экземпляров без побочных эффектов.Некоторые приложения явно предотвращают это; некоторые приложения могут использовать общие данные (файлы, реестр, базу данных), которые не предназначены/кодированы для многократного использования. Это действительно зависит от приложения. –

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