Laden...

Auf Anderen Thread warten und UI Thread nicht blockieren

Erstellt von filmee24 vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.543 Views
F
filmee24 Themenstarter:in
51 Beiträge seit 2011
vor 7 Jahren
Auf Anderen Thread warten und UI Thread nicht blockieren

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

16.807 Beiträge seit 2008
vor 7 Jahren

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

F
filmee24 Themenstarter:in
51 Beiträge seit 2011
vor 7 Jahren

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;
        }

C. Anders

5.299 Beiträge seit 2008
vor 7 Jahren

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.

16.807 Beiträge seit 2008
vor 7 Jahren

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.

5.299 Beiträge seit 2008
vor 7 Jahren

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.

16.807 Beiträge seit 2008
vor 7 Jahren

Benachrichtigung vs. Warten ist ein allgemeines Konzept; im sehr großen Regelfall unabhängig von der darunterliegenden Bibliothek 😃

F
filmee24 Themenstarter:in
51 Beiträge seit 2011
vor 7 Jahren

Thema hat sich erledigt, hab es nochmal mit der Taskcompletionsource probiert, danke

C. Anders