2014-09-15 15 views
11

Tôi đang cố gắng để gọi một phương pháp async trên một đối tượng Net thuyết minh trong Powershell:Bắt quả của Net phản đối phương pháp không đồng bộ trong PowerShell

Add-Type -Path 'my.dll' 

$myobj = new-object mynamespace.MyObj() 

$res = $myobj.MyAsyncMethod("arg").Result 

Write-Host "Result : " $res 

Khi thực hiện kịch bản, vỏ không có vẻ chờ MyAsyncMethod().Result và không hiển thị gì, mặc dù kiểm tra giá trị trả lại cho biết đó là loại chính xác (Task<T>). Nhiều nỗ lực khác, chẳng hạn như biến trung gian, Wait(), v.v. không cho kết quả nào.

Hầu hết nội dung tôi tìm thấy trên web là gọi không đồng bộ một tập lệnh Powershell từ C#. Tôi muốn ngược lại, nhưng không ai có vẻ muốn làm điều đó. Điều đó thậm chí có thể và nếu không, tại sao?

+0

Thật kỳ lạ. Điều gì sẽ xảy ra nếu bạn gọi 'myobj.MyAsyncMethod' theo cách tương tự nhưng từ ứng dụng giao diện điều khiển C#? – Noseratio

+0

Hoạt động trên máy của tôi. Bạn có chắc là bạn tạo thành công cá thể của mình không? Bởi vì dấu ngoặc đơn là không cần thiết. – i3arnon

+0

Bất cứ khi nào bạn sử dụng Add-Type, hãy đảm bảo tập lệnh chạy trong quy trình AppDomain/Powershell hoàn toàn mới. Không thể bốc dỡ các cụm lắp ráp. – Eris

Trả lời

2

Điều này phù hợp với tôi.

Add-Type -AssemblyName 'System.Net.Http' 

$myobj = new-object System.Net.Http.HttpClient 

$res = $myobj.GetStringAsync("https://google.com").Result 

Write-Host "Result : " $res 

lẽ kiểm tra rằng PowerShell được cấu hình để sử dụng .NET 4:

How can I run PowerShell with the .NET 4 runtime?

7

Tôi biết đây là một chủ đề rất cũ, nhưng nó có thể là bạn đã thực sự nhận được một lỗi từ phương pháp không đồng bộ nhưng nó đã bị nuốt vì bạn đang sử dụng .Result.

Hãy thử sử dụng .GetAwaiter().GetResult() thay vì .Result và điều đó sẽ khiến cho bất kỳ ngoại lệ nào được phát ra.

1

Đối với phương pháp chạy dài, sử dụng các mô-đun PSRunspacedDelegate, mà sẽ cho phép bạn chạy các nhiệm vụ không đồng bộ:

$task = $myobj.MyAsyncMethod("arg"); 
$continuation = New-RunspacedDelegate ([Action[System.Threading.Tasks.Task[object]]] { 
    param($t) 

    # do something with $t.Result here 
}); 

$task.ContinueWith($continuation); 

Xem documentation on GitHub. (Disclaimer: Tôi đã viết nó).

Các vấn đề liên quan