2016-05-12 27 views
0

我會遇到從多線程WinForm應用程序執行單個PowerShell腳本的任何問題嗎?我主要關心的是鎖定PowerShell腳本的WinForm線程。多線程WinForm調用PowerShell腳本.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

爲什麼你想在另一個線程上啓動一個進程? '_Proc.Start()'不會被阻止 –

+0

嘗試同時運行X更新。我過於複雜嗎? – eHaze

回答

0

如果toProcess包含值1,000,000,該怎麼辦?那麼你就產生了1m線程。 _Proc.Start()沒有被阻塞,所以你的線程將在任何時候完成,但你可能不想產生1米的進程。

如果要並行處理它們,請在線程中添加process.WaitForExit();(使執行進程處於阻塞狀態)並將它們放在ThreadPool上。 (該ThreadPool限制併發線程(因此還處理))

使用Parallel.Foreach()MaxDegreeOfParallelism屬性。

+0

至多,進程將會產生5個線程。沒想到你可以在.Net 3.5中進行並行處理? – eHaze

+0

過程總是平行的。沒有注意到3.5的要求。 –

+0

我認爲,使用ThreadPool將是明智的 –