PowerShell / PowerShell/PowerShell

Feature Request Async callbacks C# interaction

Offen
#15,080 2 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Issue-Enhancement Needs-Triage WG-Language
Vorherrschende Sprache
C#
Sterne
55.5k
Forks
8.5k
Ø Merge
1 T. 2 Std.
Gemergte PRs (30 T.)
88

Beschreibung

Summary of the new feature/enhancement

As a user I want to provide a pure script blocks to C# AsyncCallback functions so that the functions can be called via PowerShell calls. Currently PowerShell crashes because it tries to invoke the Delegate without a runspace.

Proposed technical implementation details (optional)

When casting a script block to a System.AsyncCallback add code to initialize the runspace automatically.

$http = [System.Net.HttpListener]::new()
$http.Prefixes.Add("http://127.0.0.1:9999/")
$http.Start()
[Console]::WriteLine("Listening...")

$callback = [System.AsyncCallback]{param($asyncResult); [System.Net.HttpListener]$listener = [System.Net.HttpListener] $asyncResult.AsyncState; [System.Net.HttpListenerContext]$context = $listener.EndGetContext($asyncResult); [System.Net.HttpListenerRequest]$request = $context.Request; [System.Net.HttpListenerResponse]$response = $context.Response; [string]$responseString = "<HTML><BODY>Hello World!</BODY></HTML>"; [byte[]]$buffer = [System.Text.Encoding]::UTF8.GetBytes($responseString); $response.ContentLength64 = $buffer.Length; [System.IO.Stream]$output = $response.OutputStream; $output.Write($buffer,0,$buffer.Length); $output.Close() }
[System.IAsyncResult]$result = $http.BeginGetContext($callback, $http)

$uri = [System.Uri]::new("http://127.0.0.1:9999/")
Invoke-WebRequest -Uri $uri

This should work as seemingly and with the same "restrictions" as ForEach-Object -Parallel does in regards to runspace handling.
Maybe a new more lightweight handling that only supports pure functions could be considered for both.

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne damit, das HttpListener- und System.AsyncCallback-Beispiel aus dem Issue zu reproduzieren. Verfolge dann, wie ein Scriptblock zu System.AsyncCallback gecastet wird und wie Runspaces für ForEach-Object -Parallel gehandhabt werden. Vergleiche das erwartete Callback-Verhalten mit dem aktuellen Absturz und berücksichtige die angegebene Einschränkung, dass Callbacks reine Scriptblocks unterstützen sollten. Als erledigt gilt die Aufgabe, wenn das Beispiel ohne manuelle Einrichtung von Runspaces durch PowerShell läuft.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
csharp, shell
Bereich
backend, cli
Issue-Typ
Feature
Schwierigkeit
5/5
Geschätzter Aufwand
Über eine Woche
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
25/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.