none
Task - Task.Factory.StartNew - async - await RRS feed

  • Frage

  • Hallo,
    teils würde es mit VS2012 und höher einfacher gehen.
    Verständnisfragen.
    Mit TASK kann ich ja einfach einen Thread erzeugen, der dann ja asynchron ist.
    Zu den Fragen, siehe
    //### 1 ####
    Das await bräuchte ich doch gar nicht, ich könnte doch alles mit Task.Factory erledigen.
    Was ist dennoch der Hintergrund für await?
    //### 2 ####
    Welche Schreibweisen wären richtiger?
    Gehen tun alle?
    Eine Task.Factory nehme ich, wenn ich einfach was asynchron abarbeiten will,
    die Anwendung nicht hängen soll.
    Kurzum hat jemand gute Erklärungen für diese Features?
    Wann und wie nimmt man diese?

    async, await kann ich nur zuhause testen, da meine Firma kein Geld für VS2015 hat.
    Somit muss ich noch mit den Features von 2010 leben.

    Viele Grüße Sandra

    private int MeineLangeBerechnung()
    {
    	int res = 0;
    	for (int i = 0; i < 50; i++)
    	{
    		res+=i;
    		//Zeitbedarf im aktuellen Thread simulieren:
    		Thread.Sleep(200);
    		Debug.WriteLine("Rechne + " + i.ToString());
    	}
    	return res;
    }
    
    int summe = MeineLangeBerechnung();
    
    //OK -> Synchron
    ---------------------------------------------------------------
    private async Task<int> MeineLangeBerechnungAsync1()
    {
    	int res = 0;
    	for (int i = 0; i < 50; i++)
    	{
    		res += i;
    		await Task.Delay(200); // Zeitbedarf simulieren
    		Debug.WriteLine("Rechne + " + i.ToString());
    	}
    	return res;
    }
    
    int summe = await MeineLangeBerechnungAsync1();
    
    //OK -> Asynchron, keine Threads, Anwendung hängt nicht.
    ------------------------------------------------------------------
    
    //### 1 ####
    public Task<int> MeineLangeBerechnungAsync()
    {
        return Task.Factory.StartNew<int>(() => MeineLangeBerechnung());
    }
    
    int summe = await MeineLangeBerechnungAsync();
    
    //### 2 ####
    	Task.Factory.StartNew(() =>
    	{
    	    _Manager.Shutdown();
    	});
      Task.Factory.StartNew<int>(() => _Manager.Shutdown());
      Task.Factory.StartNew(() => _Manager.Shutdown());
      
      
    var t1 = Task.Factory.StartNew(() => {Thread.Sleep(3000);});
    var t2 = Task.Factory.StartNew(() => {Thread.Sleep(5000);});
    var t3 = Task.Factory.StartNew(() => {Thread.Sleep(2000);});
    Task.WaitAll(t1, t2, t3);
    	t.Wait oder eben WaitAny-Methode.				 
    					 

    Mittwoch, 28. September 2016 17:34

Antworten

  • Hi Sandra,
    wie immer in der Programmierung gibt es verschiedene Lösungswege, um ein konkretes Ziel zu erreichen. Wichtig bei multithreading ist zu verstehen, dass zwei verschiedene Threads gleichzeitig verschiedene CPU-Kern nutzen und die gleichen Speicherbereiche lesen und beschreiben können, mal abgesehen vom Umschalten zwischen den Zeitscheiben.

    async und await ermöglichen, die aufgerufene Methode in einem anderen Thread abzuarbeiten und auf den Rückgabewert zu warten. Während dieser Wartezeit können in gleichen Thread (in welchem await aufgerufen wurde) andere Ereignisse verarbeitet werden, z.B. Aktualisierung der Bedienoberfläche. Damit die Laufzeitumgebung diesen Vorgang organisieren und verwalten kann, muss die mit await aufgerufene Methode mit async gekennzeichnet werden und ein Objekt vom Typ "Task" liefern. Um auch den Typ des Rückgabewertes prüfen zu können, muss Task entsprechend typisiert werden (in spitzen Klammern). Um auch synchrone Methoden asynchron mittels await nutzen zu können, kann man sie einfach mittels Task.Factory kapseln. Zum Factory pattern schau mal hier.

    Alternativ sind natürlich auch die Möglichkeiten von Thread, Invoke, WaitHandle usw. nutzbar.

    Ich beneide Dich nicht um Deine Firma, die keine Investitionen in produktive Arbeitsweisen (Schulung, moderne Arbeitsmittel) tätigt. Nach meinen Erfahrungen leben solche Firmen nicht allzu lange.


    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks
    Warum Groß- und Kleinschreibung wichtig ist:
    Der Gefangene floh.
    Der gefangene Floh.

    • Als Antwort markiert Sandra Bauer Sonntag, 2. Oktober 2016 14:09
    Mittwoch, 28. September 2016 19:49
  • Hi Sandra,
    dazu gibt es im Internet Unterlagen zu Hauf, z.B. in der MSDN die Webcasts zu XAML.

    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks
    Warum Groß- und Kleinschreibung wichtig ist:
    Der Gefangene floh.
    Der gefangene Floh.

    • Als Antwort markiert Sandra Bauer Sonntag, 2. Oktober 2016 14:09
    Sonntag, 2. Oktober 2016 10:45

Alle Antworten

  • Hi Sandra,
    wie immer in der Programmierung gibt es verschiedene Lösungswege, um ein konkretes Ziel zu erreichen. Wichtig bei multithreading ist zu verstehen, dass zwei verschiedene Threads gleichzeitig verschiedene CPU-Kern nutzen und die gleichen Speicherbereiche lesen und beschreiben können, mal abgesehen vom Umschalten zwischen den Zeitscheiben.

    async und await ermöglichen, die aufgerufene Methode in einem anderen Thread abzuarbeiten und auf den Rückgabewert zu warten. Während dieser Wartezeit können in gleichen Thread (in welchem await aufgerufen wurde) andere Ereignisse verarbeitet werden, z.B. Aktualisierung der Bedienoberfläche. Damit die Laufzeitumgebung diesen Vorgang organisieren und verwalten kann, muss die mit await aufgerufene Methode mit async gekennzeichnet werden und ein Objekt vom Typ "Task" liefern. Um auch den Typ des Rückgabewertes prüfen zu können, muss Task entsprechend typisiert werden (in spitzen Klammern). Um auch synchrone Methoden asynchron mittels await nutzen zu können, kann man sie einfach mittels Task.Factory kapseln. Zum Factory pattern schau mal hier.

    Alternativ sind natürlich auch die Möglichkeiten von Thread, Invoke, WaitHandle usw. nutzbar.

    Ich beneide Dich nicht um Deine Firma, die keine Investitionen in produktive Arbeitsweisen (Schulung, moderne Arbeitsmittel) tätigt. Nach meinen Erfahrungen leben solche Firmen nicht allzu lange.


    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks
    Warum Groß- und Kleinschreibung wichtig ist:
    Der Gefangene floh.
    Der gefangene Floh.

    • Als Antwort markiert Sandra Bauer Sonntag, 2. Oktober 2016 14:09
    Mittwoch, 28. September 2016 19:49
  • Ich beneide Dich nicht um Deine Firma, die keine Investitionen in produktive Arbeitsweisen (Schulung, moderne Arbeitsmittel) tätigt. Nach meinen Erfahrungen leben solche Firmen nicht allzu lange.


    Hallo Peter,

    ja so ist das im Maschinenbau. Jeder spricht von Industrie 4.0.

    Schulungen, Weiterbildung gibt es im Mittelstand nicht.

    Bei Großfirmen, wie Bosch, Siemens, Hella, Conti sieht das sicher anders aus.

    Grüße Sandra

    Samstag, 1. Oktober 2016 10:28
  • Hi Sandra,
    ich schule auch kleinere Firmen des Mittelstandes nach speziell vorher abgestimmtem Themenplan. Es ist also nicht überall so.

    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks
    Warum Groß- und Kleinschreibung wichtig ist:
    Der Gefangene floh.
    Der gefangene Floh.

    Samstag, 1. Oktober 2016 15:17

  • ich schule auch kleinere Firmen des Mittelstandes nach speziell vorher abgestimmtem Themenplan. Es ist also nicht überall so.

    Hallo Peter,

    ja ok. Dann habe ich halt Pech. Hast Du evtl. spezielle Schulungsunterlagen?

    U.a. auch WPF, UWP etc.

    Grüße Sandra

    Sonntag, 2. Oktober 2016 10:23
  • Hi Sandra,
    dazu gibt es im Internet Unterlagen zu Hauf, z.B. in der MSDN die Webcasts zu XAML.

    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks
    Warum Groß- und Kleinschreibung wichtig ist:
    Der Gefangene floh.
    Der gefangene Floh.

    • Als Antwort markiert Sandra Bauer Sonntag, 2. Oktober 2016 14:09
    Sonntag, 2. Oktober 2016 10:45