【问题标题】:Multithreaded WinForm Calling a PowerShell Script .Net 3.5多线程 WinForm 调用 PowerShell 脚本 .Net 3.5
【发布时间】:2016-09-08 10:22:03
【问题描述】:

从多线程 WinForm 应用程序执行单个 PowerShell 脚本时会遇到任何问题吗?我主要关心的是锁定 PowerShell 脚本的 WinForm 线程。

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

【问题讨论】:

  • 为什么要在另一个线程上启动一个进程? _Proc.Start() 没有阻塞
  • 尝试同时运行 X 更新。我是不是太复杂了?

标签: c# .net multithreading powershell powershell-2.0


【解决方案1】:

如果 toProcess 包含值 1,000,000 会怎样。那么你正在产生 1m 线程。 _Proc.Start() 没有阻塞,因此您的线程将立即完成,但您可能不想生成 1m 进程。

如果你想并行处理它们,在线程中添加process.WaitForExit();(使正在执行的进程阻塞)并将它们放在ThreadPool上。 (ThreadPool 限制了并发线程(也限制了进程)

Parallel.Foreach()MaxDegreeOfParallelism 属性结合使用。

【讨论】:

  • 进程最多会产生5个线程。没想到您可以在 .Net 3.5 中并行处理?
  • 进程总是并行的。没有注意到 3.5 的要求。
  • 生成的进程可以运行两个小时以上。不确定这是否更适合 ThreadPool。开发完成后,代码将移至控制台应用程序。
  • 使用线程池并没有直接的问题,只要这是应用程序唯一做的事情。通常你不应该在线程池上运行长时间运行的任务,因为它会阻塞其他线程池用户项。在这种情况下应该没有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多