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

Ich realisiere Parallel.Invoke mit await Task.Run , gibt es Nachteile oder Unterschiede?
Sebrahi
myCSharp.de - Member



Dabei seit:
Beiträge: 12

Themenstarter:

Ich realisiere Parallel.Invoke mit await Task.Run , gibt es Nachteile oder Unterschiede?

beantworten | zitieren | melden

Hallo,

     public static async void Start_myMethod1_asyncron()
    {
        await Task.Run(() => {
            myMethod1();
        });
    }
    public static async void Start_myMethod2_asyncron()
    {
        await Task.Run(() => {
            myMethod2();
        });
    }

    public static void Main(string[] args)
    {

        Start_myMethod1_asyncron();
        Start_myMethod2_asyncron();

        //difference?

        Parallel.Invoke(myMethod1, myMethod2); 

    }
Tun Start_myMethod1_asyncron() und Start_myMethod2_asyncron() zusammen das Gleiche wie Parallel.Invoke(myMethod1, myMethod2)?
Kann ich asyncron()-Methoden verwenden, um Parallelität zu realisieren?
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1795
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

Der Unterschied ist, dass Parallel.Invoke auf den Abschluss der Operationen wartet.
Deine Methoden werden hier direkt durchlaufen und übersprungen, da du keinen Task zurück gibst (async void).
Auch wenn ein await ausgeführt wird, wird die eigentliche Methode weiterlaufen.
Welchen Sinn hat dein Konstrukt überhaupt?

Nachtrag:
Schau dir für parallele Verarbeitungen mal die Parallel Klasse und Tasks im allgemeinen mal genauer an.
Je nach Anwendungsfall kannst du diese schon für parallele Verarbeitungen nutzen.
Die Frage wäre aber in welcher Form?
Wenn du z.B. Listen parallel abarbeiten musst, dann nutz die Methoden aus Parallel.For/ForEach
Wenn du einfach stumpf Methoden aufrufen willst, die auch keinen Rückgabewert/Parameter haben, kannst du das mit Parallel.Invoke machen.
Je nachdem was du machst, kannst du auch auf die .NET Api asynchron zugreifen und entsprechend deinen Code optimieren.

T-Virus
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von T-Virus am .
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.
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7523
Herkunft: Waidring

beantworten | zitieren | melden

Hallo Sebrahi,

Ergänzung / Hinweis:
Zitat von T-Virus
Parallel.Invoke auf den Abschluss der Operationen wartet.
Und zwar derart dass der aufrufende Thread (z.B. der Main-Thread) blockiert od. für eine Operation der auszuführenden verwendet wird.
Daher ist auf [FAQ] Warum blockiert mein GUI? zu achten.

Würde der Code wie folgt geschrieben sein


public static async Task Start_myMethod1_asyncron()
{
    await Task.Run(() => {
        myMethod1();
    });
}
public static async Task Start_myMethod2_asyncron()
{
    await Task.Run(() => {
        myMethod2();
    });
}

public static async Task Main(string[] args)
{

    await Task.WhenAll(Start_myMethod1_asyncron(), Start_myMethod2_asyncron());

    //difference?

    Parallel.Invoke(myMethod1, myMethod2);

}
so wird zwar per Task.WhenAll auf das Ende der Ausführungen asynchron gewartet (await), aber während dieser Zeit ist der aufrufende Thread (hier: Main-Thread) "frei" und könnte andere Aufgaben erledigten.
Beim Parallel.Invoke ist das wie erwähnt nicht möglich.

Das soll jetzt nicht heißen dass Parallel.Invoke eher schlecht ist, sondern je nach konkreter Aufgabe kann es sogar sehr nützlich sein.

Zitat von T-Virus
Wenn du einfach stumpf Methoden aufrufen willst, die auch keinen Rückgabewert/Parameter haben, kannst du das mit Parallel.Invoke machen.
Parallel Linq (PLinq) ist eine weitere Option die ganz passend sein kann.

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!"
private Nachricht | Beiträge des Benutzers