【问题标题】:Powershell threading vs C# threadingPowershell 线程与 C# 线程
【发布时间】:2021-05-29 22:25:54
【问题描述】:

在 C# 中,当我想创建一个调用函数的线程时,我只需这样做。

Thread t = new Thread(() => calledFunction());
t.Start();

我的目标是在 Powershell 中做同样的事情。没什么特别的,它唯一的目的是防止 GUI 冻结。但我就是找不到可行的解决方案。

目前,我只是想让运行空间做任何事情。 如果我把它放在按钮的点击事件中,什么都不会发生。

$Runspace = [runspacefactory]::CreateRunspace()
$PowerShell = [powershell]::Create()
$PowerShell.runspace = $Runspace
$Runspace.Open()

[void]$PowerShell.AddScript({

    $test = "test"
    Write-Host $test

})

$PowerShell.Invoke()

但是,如果我在脚本块中放置一个消息框,那就可以了。当有些事情起作用而有些事情不起作用时,我感到非常困惑。

如果您有一项任务,您必须调用一个执行某些工作并更新 GUI 的函数。您将如何在自己的线程中调用该函数,以便 GUI 在 Powershell 中工作时不会冻结?在 C# 中,我有上面发布的简单示例或使用 BackgroundWorker。

【问题讨论】:

标签: c# multithreading powershell runspace


【解决方案1】:

如果我把它放在按钮的点击事件中

$PowerShell.Invoke()同步执行,所以它会根据定义阻塞直到你添加的脚本完成,所以它冻结图形用户界面。

什么都没有发生。

Write-Host $test(在 PSv5+ 中)写入 信息流(流号 6),直接由 .Invoke() 调用返回 - 仅限成功输出(流号1)是;见about_Redirection

此外,即使有成功输出,从事件处理程序输出到成功流也不会显示在控制台(终端)中。


如果您有一项任务,您必须调用一个执行某些工作并更新 GUI 的函数。您将如何在其自己的线程中调用该函数,以便 GUI 在 Powershell 中工作时不会冻结?

参见下面的WPF-based answer,可以相对轻松地适应WinForms。

【讨论】:

  • 谢谢你的信息!我找到了一个使用同步哈希表的工作解决方案。但是,其他一些怪癖阻止我调用存储在我创建的另一个文件中的函数。我想我必须以某种方式将文件导入到代码块中,就像使用哈希表一样。有什么想法吗?
  • @Jomasdf,请注意,链接的基于 WPF 的答案使用基于线程作业的方法,在主线程上有一个循环(while 循环在显示后基本上就像一个消息循环GUI 非模态),它消除了用户代码中跨线程同步的需要,我认为这最终使得代码更简单、更符合 PowerShell 习惯。至于您的后续问题:我鼓励您提出问题帖子,您可以在其中提供足够的详细信息以供其他人理解问题并提供帮助。完成后,请随时在此处发表评论,让我知道。
  • 谢谢。我发布了一个新问题:stackoverflow.com/questions/66430360/…
猜你喜欢
  • 2013-02-03
  • 2011-07-30
  • 2011-08-06
  • 2010-09-18
  • 1970-01-01
  • 2013-10-16
  • 2021-05-18
  • 2018-08-24
  • 1970-01-01
相关资源
最近更新 更多