4

我必须在.NET 对象上调用一个方法,该方法定义为

IAsyncResult BeginListMetrics( ListMetricsRequest listMetricsRequest, AsyncCallback 回调, 对象状态)

是否可以将 powershell 函数用作 AsyncCallback 委托?如何?

4

2 回答 2

8

脚本块可以通过以下转换转换为大多数类型的委托。

$myCallback = [AsyncCallback]{
  param( $asyncResult)
  # callback code
  if ($asyncResult.isCompleted) {
    get-date
  }
}
于 2013-06-07T01:10:27.040 回答
2

虽然@Xpw 的答案是正确的,并且将 Scriptblocks 转换为委托通常很有用,但对于 的特定情况AsyncCallback,通常需要更多。

Oisin Grehan 的PowerShell 2.0 – 来自 .NET 的异步回调解释了该问题并提供了解决方案。一个完整的例子是可用的。虽然 Oisin 清楚地说明了问题,但如果您不熟悉Register-Objectevent ,他的解决方案将难以理解。

有关详细信息,请参阅 Oisin 的精彩文章。简而言之, anAsyncCallback通过线程池调用,因此无法运行 ScriptBlock,因为该线程没有 PowerShell RunSpace。解决方法是嵌入一个小型 C# 类,该类接受AsyncCallback并引发事件,同时Register-ObjectEvent用于在 PowerShell 中设置事件处理程序。

于 2016-12-15T02:08:59.490 回答