Получение результата асинхронного метода .Net объекта в powershell
Я пытаюсь вызвать метод async для объекта .NET, созданного в Powershell:
Add-Type -Path 'my.dll'
$myobj = new-object mynamespace.MyObj()
$res = $myobj.MyAsyncMethod("arg").Result
Write-Host "Result : " $res
При выполнении script оболочка, похоже, не ждет MyAsyncMethod().Result
и ничего не отображает, хотя проверка возвращаемого значения указывает, что это правильный тип (Task<T>
). Различные другие попытки, такие как промежуточные переменные, Wait()
и т.д., Не дали никаких результатов.
Большинство вещей, которые я нашел в Интернете, - это асинхронное вызов Powershell script из С#. Я хочу обратить вспять, но никто, кажется, не заинтересован в этом. Возможно ли это, а если нет, то почему?
Ответы
Ответ 1
Я знаю, что это очень старый поток, но может быть, вы действительно получали ошибку от метода async, но его проглатывали, потому что вы использовали .Result
.
Попробуйте использовать .GetAwaiter().GetResult()
вместо .Result
, и это приведет к буферизации всех исключений.
Ответ 2
Это работает для меня.
Add-Type -AssemblyName 'System.Net.Http'
$myobj = new-object System.Net.Http.HttpClient
$res = $myobj.GetStringAsync("https://google.com").Result
Write-Host "Result : " $res
Возможно, проверьте, что PowerShell настроен на использование .NET 4:
Как запустить PowerShell со средой .NET 4?
Ответ 3
Для длительных методов используйте модуль PSRunspacedDelegate
, который позволит вам выполнить задачу асинхронно:
$task = $myobj.MyAsyncMethod("arg");
$continuation = New-RunspacedDelegate ( [Action[System.Threading.Tasks.Task[object]]] {
param($t)
# do something with $t.Result here
} );
$task.ContinueWith($continuation);
Смотрите документацию по GitHub. (Отказ от ответственности: я написал его).