2016-05-12 6 views
0

Kann ich Probleme bei der Ausführung eines einzelnen PowerShell-Skripts in einer Multithread-WinForm-Anwendung feststellen? Mein Hauptanliegen betrifft die WinForm-Threads, die das PowerShell-Skript sperren.Multithread WinForm Aufrufen eines PowerShell-Skripts .Net 3.5

for (int i = 0; i <= toProcess; i++) 
{ 
    bWorker.ReportProgress(0, i.ToString()); 
    PowerShellProcs workPs = new PowerShellProcs(); 

    workPs.CusId = CustomerDataTable.Rows[i]["CustomerID"].ToString(); 

    ThreadStart threadDelegate = new ThreadStart(workPs.DoPs); 
    Thread newThread = new Thread(threadDelegate); 
    newThread.Name = CustomerDataTable.Rows[i]["CustomerID"].ToString(); 
    newThread.Start(); 

    if (toProcess == i) 
    { 
     resetEvent.Set(); 
    } 
    Thread.Sleep(1000); 

    //threads.Add(newThread); 
} 

class PowerShellProcs 
{ 
    public string CusId; 
    public void DoPs() 
    { 
     String customerId = CusId; 
     var scriptfile = @"c:\ProcessCustomer.ps1";   
     Process _Proc = new Process(); 
     _Proc.StartInfo = "Powershell.exe"; 
     _Proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
     _Proc.StartInfo.Arguments = "'" + customerId + "' "; 
     _Proc.Start(); 
    } 
} 
+0

Warum möchten Sie einen Prozess in einem anderen Thread starten? '_Proc.Start()' blockiert nicht –

+0

Versuchen, X-Updates zur gleichen Zeit auszuführen. Übertreibe ich es? – eHaze

Antwort

0

Was ist, wenn toProcess den Wert 1.000.000 enthält. dann spawnen Sie 1m Threads. Die _Proc.Start() blockiert nicht, so dass Ihre Threads in kürzester Zeit fertig sind, aber Sie werden wahrscheinlich keine 1m Prozesse erstellen wollen.

Wenn Sie sie parallel verarbeiten möchten, fügen Sie die process.WaitForExit(); (um den ausführenden Prozess blockieren) in den Thread und legen Sie sie auf ThreadPool. (Die ThreadPool die gleichzeitigen Threads begrenzt (so verarbeitet auch))

oder

verwenden, um die mit der Parallel.Foreach()MaxDegreeOfParallelism Eigenschaft.

+0

Der Prozess wird höchstens 5 Threads erzeugt haben. Dachten Sie nicht, dass Sie in .Net 3.5 parallel verarbeiten könnten? – eHaze

+0

Prozesse sind immer parallel. Habe die 3.5 Anforderung nicht bemerkt. –

+0

Ich denke, mit 'ThreadPool' wäre klug –