Получение результата асинхронного метода .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. (Отказ от ответственности: я написал его).