C # winForms et NetworkStream.beginRead (), comment ouvrir un nouveau formulaire en fonction de l'événement réseau?
-
14-11-2019 - |
Question
J'ai de sérieux problèmes à obtenir la communication d'un fil à un autre travail entre NetworkStream.beginRead () et une classe WinForms (je suis un vrai débutant en ce qui concerne des sujets tels que le filetage et les appels asynchrones).
En particulier, je suis connecté à un client distant via un socket net, en écoutant simplement des événements. Lorsque j'en reçois un, je peux le collecter correctement en une chaîne en utilisant les méthodes BeginRead () et EndRead () de NetworkSstream, pas de problèmes. J'ai l'intention d'ouvrir ensuite un nouveau formulaire (en utilisant la chaîne comme paramètre dans le constructeur du formulaire) afin que les informations puissent être affichées à l'utilisateur. En effet, l'événement réseau déclenchera un formulaire pour que l'utilisateur soit ouvert, et les informations cependant, je rencontre constamment CrossthreadMessagingExceptions, et je ne connais pas assez les délégués que je suis convaincu que je le fais bien. Quelqu'un pourrait-il me diriger dans la bonne direction?
La solution
La règle est: "Vous ne pouvez accéder aux contrôles que sur le fil sur lequel ils ont créé"
Les rappels asynchronisés reviennent sur un autre fil, vous devez donc rassembler le fil d'interface utilisateur si vous souhaitez communiquer entre les formulaires.
En supposant que vous êtes NetworkStream
Le code est déjà sous un formulaire, il vous suffit d'utiliser invoquer ou beginInvoke. Par exemple:
private void MyAsyncCallback(IAsyncResult ar) { var yourString = ...from your socket...; this.Invoke(new MethodInvoker(() => new Form(yourString))); }