Laden...

async Task<bool>

Erstellt von TheGateway vor 2 Jahren Letzter Beitrag vor 2 Jahren 1.278 Views
T
TheGateway Themenstarter:in
12 Beiträge seit 2020
vor 2 Jahren
async Task<bool>

Hallo, ich habe folgendes Problem:


public async Task<bool> test()
        {

            try
            {
                
                if (Management() == true) // <<- hier ist das Problem!
                {
                 }
            }
            catch (Exception e)
            {

                Console.WriteLine(e);
                
            }

            return false;
        }


 public async Task<bool> Management()
        {

            try
            {
               //code
               return true;
            }
            catch (Exception e)
            {

                Console.WriteLine(e);

            }

            return false;
        }

Fehlermeldung:
Der ==-Operator kann nicht auf Operanden vom Typ "Task<bool>" und "bool" angewendet werden.

hat jemand eine Idee? ich brauche unbedingt async da meine GUI sonst blockiert 😦, ich muss wissen ob die Funktion Management true or false ist ....

D
152 Beiträge seit 2013
vor 2 Jahren
T
TheGateway Themenstarter:in
12 Beiträge seit 2020
vor 2 Jahren

vielen vielen dank!

T
TheGateway Themenstarter:in
12 Beiträge seit 2020
vor 2 Jahren

Hi,
eine frage habe ich noch...


public async Task<bool> IsClientOnline()
        {

            await Task.Delay(2000);
            
            foreach (Process p in Process.GetProcesses())
            {

                if (p.MainWindowTitle.Contains("Programm -"))
                {
                    if (p.MainWindowTitle.Length > 0)
                    {
                        var username = p.MainWindowTitle;
                        ClientName.Items.Add(username.Remove(0, 6));
                        ClientHandleNr.Items.Add(p.MainWindowHandle);
                        return true;

                    }

                }

            }

                return false;

        }

bekommt man die forearch auch irgendwie async ?

C
55 Beiträge seit 2020
vor 2 Jahren

Hallo,

Eine kleine Anmerkungen zu deinen Code
Deine geschachtelte if Anweisung ist Redundant bzw. in dieser Form unnötig. Wenn das MainWindowTitle schon die Zeichenfolge "Programm -" enthält ist auch, auch gleichzeitig die Length größer als 0. Umgekehrt würde das ganze etwas eher Sinn machen. Noch besser wäre folgende Variante:


public async Task<bool> IsClientOnline()
        {

            await Task.Delay(2000);

            foreach (Process p in Process.GetProcesses())
            {

                if (!p.MainWindowTitle.Contains("Programm -") || p.MainWindowTitle.Length == 0)
                {
                     continue; // oder etwas anderes
                }
                 var username = p.MainWindowTitle;
                ClientName.Items.Add(username.Remove(0, 6));
                ClientHandleNr.Items.Add(p.MainWindowHandle);
                return true;

            }

                return false;

        }

6.911 Beiträge seit 2009
vor 2 Jahren

Hallo TheGateway,

warum überhaupt async wenn im Code nur synchrone Teile vorkommen? Od. ist das Beispiel zu sehr gekürzt?

bekommt man die forearch auch irgendwie async ?

Mit C# 8 async Streams ist es möglich.
Macht aber nur Sinn wenn es tatsächlich asynchrone Vorgänge sind (z.B. Datenbank, HTTP-Requests, etc.)

Noch etwas: [Tipp] Anfängerhinweis == true / == false

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

T
TheGateway Themenstarter:in
12 Beiträge seit 2020
vor 2 Jahren

Hallo TheGateway,

warum überhaupt async wenn im Code nur synchrone Teile vorkommen? Od. ist das Beispiel zu sehr gekürzt?

Ich habe noch nicht erkannt, wieso meine GUI hängt bei dieser foreach, ich ging davon aus, dass die Methode schon async ist, dass dann der Inhalt auch async ausgeführt wird.
Ob das sinn macht weiß ich nicht, er soll mir die Prozesse auflisten und eintragen, ich wüsste grad keinen anderen Ansatz als dies mit einer foreach zu tun.

Eine kleine Anmerkungen zu deinen Code

vielen dank für den hinweis.

T
2.219 Beiträge seit 2008
vor 2 Jahren

Ich würde die Prüfung auf die Länge des MainWindowTitle vor dem Contains machen.
Ist die Länge 0, dann kann man sich das Contains sparen, was du aktuell aber immer machst!
So macht man erst ein Contains, was false liefert nur um dann erst zu merken, dass dort eh nichts drin steh.
Bzw. würde ich anstelle der Länge mit String.IsNullOrEmpty prüfen, damit es klarer ausgedrückt ist.

Den String "Programm -" solltest du nicht mitten im Code stehen haben.
Schieb diesen als Konstante (const string) in die Klasse ein.

Beim auslesen des Username macht du einfach ein Substring(0, 6).
Ohne zu wissen was in MainWindowTitle stehen sollte, könnte dort auch zufällig ein "Programm -" in einem fremden Programm stehen.
Ggf. solltest du den Part noch weiter abdichten, damit du keine falschen Einträge speicherst.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

16.806 Beiträge seit 2008
vor 2 Jahren

Das doofe ist, dass Dein Try and Error Vorgehen hier nicht helfen wird.
async/await ist leider ein Konzept, das man verstehen muss. Sonst wendet man es - wie hier - in 99% der Fälle falsch an.

Du musst auch nicht die Schleife asynchron auslagern, sondern das GetProcesses.


private static Task<Process[]> InternalGetProcessesAsync()
    => Task.Run(Process.GetProcesses);

Das kannst Du dann vor dem Schleifenzugriff asynchron aufrufen.

Aber wie gesagt: schau Dir ein Tutorial von async/await an, versuch es zu verstehen.
Ansonsten zeigt die Vergangenheit, dass in der Regel Murks bei raus kommt.

C
55 Beiträge seit 2020
vor 2 Jahren

Ich würde die Prüfung auf die Länge des MainWindowTitle vor dem Contains machen.
Ist die Länge 0, dann kann man sich das Contains sparen, was du aktuell aber immer machst!
So macht man erst ein Contains, was false liefert nur um dann erst zu merken, dass dort eh nichts drin steh.
Bzw. würde ich anstelle der Länge mit String.IsNullOrEmpty prüfen, damit es klarer ausgedrückt ist.

Tatsächlich könnte man sich den Check auf die Länge des String sparen. Ein Contains liefert auch dann ein false, wenn nix in dem String steht. In seinem Code prüft er zuerst ob eine Zeichenfolge enthalten ist und wenn ja dann wird noch mal die Länge geprüft. Welches dann immer true zurück gibt.

T
2.219 Beiträge seit 2008
vor 2 Jahren

@ClaraSoft
Ist mir klar, aber schau dir mal die Implementierungen von Contains und IsNullOrEmpty an.
Ein Contains ist aufwändiger in der Verwendung, da beim Contains auch noch die aktuelle Sprache beim Vergleich der Strings berücksichtigt werden muss.
Je nachdem wie häufig man Contains nutzt, umso mehr Laufzeit kostet der Einsatz.
Ein IsNullOrEmpty Check ist da umlängen effizienter, da die Prüfung keine zusätzlichen Resourcen benötigt.

Außerdem kann man damit auch klarer ausdrücken, dass man bei leeren Strings auch direkt raus kann.
Sonst muss jedes mal erst ein Contains durchlaufen, was bei längeren Strings auch etwas mehr Laufzeit benötigt.
Und je nach Anzahl der Programme sowie der Häufigkeit der Abfrage der Programme, kann dies auf lange Sicht unnötig Laufzeit kosten.
Wenn es hier also auch um Millisekunden geht, dann kann man hier auch einiges einsparen.

Nachtrag:
Hier auch noch der Hinweis von Process.MainWindowTitle:
Process.MainWindowTitle Eigenschaft (System.Diagnostics)

Dieses kann bei Anwendungen ohne UI auch einen leeren String liefern.
In dem Fall ist ein Check auf NullOrEmpty zu erst sinnvoller.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.