Question Classe AsyncCallBack

Plus d'informations
il y a 15 ans 1 mois #7881 par Arthur
Classe AsyncCallBack a été créé par Arthur
(Avant tout je suis désolé pour le manque d'accents etant en ce moment et pour un bout de temps encore dans un pays ou le clavier qwerty est roi. )

Bonjour,
Voila en ce moment pour le fun je code un client Telnet asynchrone en FULL Powershell (Pas de C#, c'est le challenge :) )

Seulement pour ce faire il faut utiliser la methode : BeginReceive ( ou Send )de la classe socket (msdn.microsoft.com/en-us/library/system.net.sockets.aspx) avec en parametre un obj \"AsyncCallback\" (msdn.microsoft.com/en-us/library/bew39x2a.aspx)

Et la c'est le drame.

Il est visiblement impossible d'utiliser AsyncCallback avec Powershell, j'ai un peu pret tout essayé.

J'en suis donc venu avec plusieurs solutions possibles :

1. Passer par les runspaces mais le probleme c'est qu'il faut modifier tout l'architecture du programe, et c'est ch.. compliqué. :)


2 Utiliser une fonction qui permet d'utiliser les AsyncCallback sous Powershell ( www.nivot.org/2009/10/09/PowerShell20Asy...allbacksFromNET.aspx )
Seulement la fonction utilise du C#, mais surtout elle n'est pas vraiment documenté et je n'arrive pas a l'utliser.(Enfin en cherchant un peu plus je devrais surement pouvoir l'utiliser) :pinch:

3 Une autre solution peu plausible est de trouver un autre moyen d'utiliser les AsyncCallback en mode \"MTA\" cela devrait marcher non ? :dry:

Bref j'ai plusieurs solutions mais je ne sait pas trop quoi choisir, aucune n'est parfaite.

J'en viens donc a demander des conseils sur quel solution choisir.Ou si il y a une autre solution ?

Merci.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 1 mois #7885 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Classe AsyncCallBack
bilbao écrit:

Pas de C#, c'est le challenge :)

Ou une prise de tête :laugh:

Concernant le code de Oisin Grehan c'est vrai que l'exemple est un peu court .
Pourquoi ne pas utiliser un job pour ton traitement asynchrone ?
Son code s'appuit sur un event PS pour déclencher le callback.

Ce MVP produit du code très pointu, mais il est parfois à la limite du proof of concept.
bilbao écrit:

je code un client Telnet asynchrone en FULL Powershell

Bonne chance :)

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 1 mois #7886 par Arthur
Réponse de Arthur sur le sujet Re:Classe AsyncCallBack
En faite le probleme du Job/runspace est qu'il necessite un changement dans l'architecture du programme, je m'explique :

la classe socket possede 2 methodes pour chaque fonctions send,receive et connect : BeginSend() Send() , BeginReceive(), Receive() etc...

La grosse difference vient du fait que Beginsend() est specialement fait pour le traitement Asynchrone, cela permet a .NET de nous economiser un gros paquet de lignes de code, sauf que ces methodes necessitent un AsyncCallBack delegate en parametre. :pinch:
Cependant il est visiblement impossible de l'initialiser directement sous Powershell

Donc si je passse par des Job/runspace je vais devoir faire changer ma methode en passant par la methode Send() et je vais devoir taper plus de lignes.Et avoir quelques prises de têtes. :P

Ou une prise de tête


C'est pour le challenge sinon tant qu'a piquer du code C# autant carement coder les classes en C# et faire un chti script qui les initialisent.Mais la c'est pas fun. :)

Dans le pire des cas je ferais comme ca mais j'apprendrais rien sur powershell. :angry:

Message édité par: bilbao, à: 1/10/10 19:33<br><br>Message édité par: bilbao, à: 2/10/10 18:54

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 1 mois #7887 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Classe AsyncCallBack
bilbao écrit:

En faite le probleme du Job/runspace est qu'il necessite un changement dans l'architecture du programme

Cela peut arriver si on s'aperçoit tardivement d'une impossibilité technique ou d'une erreur de conception.
bilbao écrit:

Dans le pire des cas je ferais comme ca mais j'apprendrais rien sur powershell.

Si, de connaître ses limites. Savoir quand utiliser PS et quand utiliser C# ou coupler les deux, c'est un gain de temps dans le choix de l'implémentation.

Essai ce code :
[code:1]
#http://msdn.microsoft.com/fr-fr/library/system.asynccallback.aspx
#http://msdn.microsoft.com/fr-fr/library/ms228972.aspx
#On exécute le code d'exemple en une seule passe, i.e dans le même pipeline
&amp;{
#Création d'une variable typé [AsyncCallback]
#Crée en interne un abonnement (donc aussi un job)
$CallBack=New-ScriptBlockCallback {
param($AsyncResult)
Write-host \&quot;Thread dns $([System.Threading.Thread]::CurrentThread.ManagedThreadId)\&quot; -fore green
$hostName=$AsyncResult.AsyncState
Write-host \&quot;dns :$hostName\&quot; -fore green
#Sleep 2
$HostEntry=[System.Net.Dns]::EndGetHostEntry($AsyncResult)
Write-host \&quot;IP= $($HostEntry.AddressList)\&quot; -fore green
}

$myHost='WWW.Yahoo.fr'
Write-host \&quot;Thread console $([System.Threading.Thread]::CurrentThread.ManagedThreadId)\&quot; -fore white
#Le code PS déclaré dans $Callback est exécuté dans un job
$r=[System.Net.Dns]::BeginGetHostEntry($myHost,$CallBack,$myHost)

Write-Host \&quot;[Main] Attente\&quot; -fore white
#Sleep 4
Write-host \&quot;[Main] Fin\&quot; -fore white
#TODO remove : abonnement et job
}
[/code:1]
J'ai toutefois un doute quand au terme async callback (Allows running ScriptBlocks via .NET async callbacks.).
De rendre possible l'exécution de code PS par une méthode \&quot;pure dotnet\&quot; via une fonction de rappel oui, mais en asynchrone pas vraiment, c'est le JOB PowerShell qui s'en charge.
La méthode New-ScriptBlockCallback renvoi un System.AsyncCallback, mais c'est un pont utilisé pour déclencher un événement sur lequel on greffe un JOB.
Ici les numéros de thread sont identiques alors qu'en C# ils sont différents.<br><br>Message édité par: Laurent Dardenne, à: 2/10/10 20:19

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 1 mois #7891 par Arthur
Réponse de Arthur sur le sujet Re:Classe AsyncCallBack
En effet j'ai moi aussi le meme thread.
Avant de succomber a la facilité je vais voir si il n'y a pas un moyen de faire le client avec les Runspaces/Jobs.

Par exemple je créer un runspace qui est toujours en écoute sur le serveur et si je colle un Event Handler dessus pour récupérer chaques réponses du serveur ?
Ce n'est pas vraiment de l’asynchrone au sens strict mais ca en donne l'illusion , non ? :dry:

Edit :

Sinon je voulais savoir quel est la réel utilité du mode MTA de Posh car on peut toujours utiliser les jobs en STA ?

(Je suis 95% du temps en MTA alors je ne me suis jamais poser la question :blush: )<br><br>Message édité par: bilbao, à: 4/10/10 18:55

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 1 mois #7895 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Classe AsyncCallBack
bilbao écrit:

Avant de succomber a la facilité

Laquelle ?
bilbao écrit:

Par exemple je créer un runspace qui est toujours en écoute sur le serveur et si je colle un Event Handler dessus pour récupérer chaques réponses du serveur ?

Tu peux reformuler ?
bilbao écrit:

Sinon je voulais savoir quel est la réel utilité du mode MTA de Posh

Les notions STA/MTA ne sont pas liés à powershell, mais à la techno COM, voir ce post , et Understanding and Using COM Threading Models .
Mais là je n'ai trop le temps d'approfondir ce sujet.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.082 secondes
Propulsé par Kunena