Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Auf Anderen Thread warten und UI Thread nicht blockieren
filmee24
myCSharp.de - Member



Dabei seit:
Beiträge: 57

Themenstarter:

Auf Anderen Thread warten und UI Thread nicht blockieren

beantworten | zitieren | melden

Hallo,

ich hab folgendes Problem. Ich nutze das Shellcontrol von Codeproject und möchte die commands die eingegeben werden in Console.Readlne wrappen.

Leider blocken alle meine versuche den UIThread und das Event kann niemanls ausgelöst werden wodurch der andere wartende thread wieder freigegeben werden würde.

Mein Code:


using System;
using System.IO;
using System.Threading;
using UILibrary;

namespace HackIt.Core
{
    public class ShellReader : TextReader
    {
        private ShellControl shellControl1;

        public ShellReader(ShellControl shellControl1)
        {
            this.shellControl1 = shellControl1;
        }

        public override string ReadLine()
        {
            EventCommandEntered handler = null;
            string value = "";

            ManualResetEvent oSignalEvent = new ManualResetEvent(false);
            Thread oSecondThread = new Thread(() =>
            {
                handler = new EventCommandEntered((s, e) =>
                {
                    value = e.Command;
                    oSignalEvent.Set();

                    shellControl1.CommandEntered -= handler;
                });

                shellControl1.CommandEntered += handler;
            });

            oSecondThread.Start();

            shellControl1.BeginInvoke(new Action(() => { oSignalEvent.WaitOne(); }));
            
            return value;
        }
    }
}

Ich hoffe jemand kann mir helfen, ich weiß keine Lösung mehr.

mfg

Chris
C. Anders
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16110

beantworten | zitieren | melden

Ich weiß nicht ganz, was das werden soll.
Aber das Warten löst man bei modernen Implementierungen eher mit Task und ContinueWith.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
filmee24
myCSharp.de - Member



Dabei seit:
Beiträge: 57

Themenstarter:

beantworten | zitieren | melden

hier der selbe versuch mit taskcompletionsource, aber leider selbes problem:

 public override string ReadLine()
        {
            EventCommandEntered handler = null;
            string value = null;
            var tcs = new TaskCompletionSource<string>();

            handler = new EventCommandEntered((s, e) =>
            {
                value = e.Command;

                tcs.SetResult(value);

                shellControl1.CommandEntered -= handler;
            });

            shellControl1.CommandEntered += handler;

            tcs.Task.Wait();

            return tcs.Task.Result;
        }
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von filmee24 am .
C. Anders
private Nachricht | Beiträge des Benutzers
ErfinderDesRades
myCSharp.de - Experte

Avatar #avatar-3151.jpg


Dabei seit:
Beiträge: 5409

beantworten | zitieren | melden

Zitat von filmee24
Ich nutze das Shellcontrol von Codeproject und möchte die commands die eingegeben werden in Console.Readlne wrappen.
ich denke, hier kann man nur helfen, wenn man das ShellControl von Codeproject kennt.
Ich kann mir unter "commands in Console.Readline wrappen" gar nichts vorstellen.
Entweder muss das ein Feature dieses Controls sein, oder die Absicht ist so unverständlich beschrieben, dass sie unverständlich ist.

ZB in meiner Welt hat Console.ReadLine() in einer WinForms-Anwendung gar keine Funktion.
Der frühe Apfel fängt den Wurm.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16110

beantworten | zitieren | melden

Naja. Er wartet im Hauptthread.
Deswegen blockiert die GUI.

Dahingehend mein vergangener Hinweis, dass man eigentlich nicht wartet, sondern durch ContinueWith etwas anstößt, sobald etwas fertig ist.
Warten muss man heutzutage eigentlich nicht mehr (oft).
Nur hat er statt ContinueWith, was mein Vorschlag war, einfach nur 1:1 den Code von Thread in Tasks übernommen und damit nichts gewonnen.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
ErfinderDesRades
myCSharp.de - Experte

Avatar #avatar-3151.jpg


Dabei seit:
Beiträge: 5409

beantworten | zitieren | melden

wie gesagt - der Zweck der Veranstaltung liegt mir im Dunkeln.

Ich habe zB die Vermutung, dass Warten an sich hier das falsches Mittel ist, und dass evtl. eventorientiert konzipiert werden müsste statt mit Nebenläufigkeit.

Aber nix genaues weiß man nicht.
Der frühe Apfel fängt den Wurm.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16110

beantworten | zitieren | melden

Benachrichtigung vs. Warten ist ein allgemeines Konzept; im sehr großen Regelfall unabhängig von der darunterliegenden Bibliothek :-)
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
filmee24
myCSharp.de - Member



Dabei seit:
Beiträge: 57

Themenstarter:

beantworten | zitieren | melden

Thema hat sich erledigt, hab es nochmal mit der Taskcompletionsource probiert, danke
C. Anders
private Nachricht | Beiträge des Benutzers