我必须在.NET 对象上调用一个方法,该方法定义为
IAsyncResult BeginListMetrics( ListMetricsRequest listMetricsRequest, AsyncCallback 回调, 对象状态)
是否可以将 powershell 函数用作 AsyncCallback 委托?如何?
我必须在.NET 对象上调用一个方法,该方法定义为
IAsyncResult BeginListMetrics( ListMetricsRequest listMetricsRequest, AsyncCallback 回调, 对象状态)
是否可以将 powershell 函数用作 AsyncCallback 委托?如何?
脚本块可以通过以下转换转换为大多数类型的委托。
$myCallback = [AsyncCallback]{
param( $asyncResult)
# callback code
if ($asyncResult.isCompleted) {
get-date
}
}
虽然@Xpw 的答案是正确的,并且将 Scriptblocks 转换为委托通常很有用,但对于 的特定情况AsyncCallback
,通常需要更多。
Oisin Grehan 的PowerShell 2.0 – 来自 .NET 的异步回调解释了该问题并提供了解决方案。一个完整的例子是可用的。虽然 Oisin 清楚地说明了问题,但如果您不熟悉Register-Objectevent ,他的解决方案将难以理解。
有关详细信息,请参阅 Oisin 的精彩文章。简而言之, anAsyncCallback
通过线程池调用,因此无法运行 ScriptBlock,因为该线程没有 PowerShell RunSpace。解决方法是嵌入一个小型 C# 类,该类接受AsyncCallback
并引发事件,同时Register-ObjectEvent
用于在 PowerShell 中设置事件处理程序。