You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Wie schaffen es erfahrene Entwickler innerhalb kürzester Zeit Prototypen mit beeindruckender Funktionalität zu entwerfen? Sicher, die Erfahrung spielt hier eine große Rolle aber auch die Wiederverwendung von existierendem Code. Häufig wiederkehrende Aufgaben wie zum Beispiel:
41
+
42
+
+ das Logging
43
+
+ der Zugriff auf Datenquellen
44
+
+ mathematische Operationen
45
+
+ Datenkapselung und Abstraktion
46
+
+ ...
47
+
48
+
werden bereits durch umfangreiche Bibliotheken implementiert und werden entsprechend nicht neu geschrieben.
49
+
50
+
Ok, dann ziehe ich mir eben die zugehörigen Repositories in mein Projekt und kann die Bibliotheken nutzen. In individuell genutzten Implementierungen mag das ein gangbarer Weg sein, aber das Wissen um die zugehörigen Abhängigkeiten - Welche Subbibliotheken und welches .NET Framework werden vorausgesetzt? - liegt so nur implizit vor.
51
+
52
+
Entsprechend brauchen wir ein Tool, mit dem wir die Abhängigkeiten UND den eigentlichen Code kombinieren und einem Projekt hinzufügen können.
53
+
`NuGet` löst diese Aufgabe für .NET und schließt auch gleich die Mechanismen zur Freigabe von Code ein. NuGet definiert dabei, wie Pakete für .NET erstellt, gehostet und verarbeitet werden.
54
+
55
+
Ein `NuGet`-Paket ist eine gepackte Datei mit der Erweiterung `.nupkg` die:
56
+
57
+
+ den kompilierten Code (DLLs),
58
+
+ ein beschreibendes Manifest, in dem Informationen wie die Versionsnummer des Pakets, ggf. der Speicherort des Source Codes oder die Projektwebseite enthalten sind sowie
59
+
+ die Abhängigkeiten von anderen Paketen und dessen Versionen
60
+
enthalten sind
61
+
Ein Entwickler, der seinen Code veröffentlichen möchte generiert die zugehörige Struktur und läd diese auf einen `NuGet` Server. Unter dem [Link](https://www.nuget.org/) kann dieser durchsucht werden.
62
+
63
+
**Anwendungsbeispiel: Symbolisches Lösen von Mathematischen Gleichungen**
64
+
65
+
Eine entsprechende Bibliothek steht unter [Projektwebseite](https://symbolics.mathdotnet.com/). Das Ganze wird als `Nuget` Paket gehostet [MathNet](https://www.nuget.org/packages/MathNet.Symbolics/).
66
+
67
+
Unter der Annahme, dass wir `dotnet` als Buildtool benutzen ist die Einbindung denkbar einfach.
68
+
69
+
```
70
+
dotnet new console -o SymbolicMath
71
+
cd SymbolicMath
72
+
dotnet add package MathNet.Symbolics
73
+
Determining projects to restore...
74
+
Writing /tmp/tmpNsaYtc.tmp
75
+
info : Adding PackageReference for package 'MathNet.Symbolics' into project '/home/zug/Desktop/Vorlesungen/VL_Softwareentwicklung/code/16_Testen/ConditionalBuild/ConditionalBuild.csproj'.
76
+
info : GET https://api.nuget.org/v3/registration5-gz-semver2/mathnet.symbolics/index.json
77
+
...
78
+
```
79
+
80
+
Danach findet sich in unserer Projektdatei `.csproj` ein entsprechender Eintrag
|**Zweck**| Repräsentiert einen physischen Ausführungspfad (Thread of Execution). | Repräsentiert eine asynchrone, geplante Arbeitseinheit auf höherer Abstraktionsebene. |
421
+
|**Erstellung**| Mit `new Thread()` explizit erstellt. | Mit `Task.Run()` oder `Task.Factory.StartNew()` gestartet, meist über Thread-Pool. |
422
+
|**Verwaltung**| Muss manuell gestartet und verwaltet werden. | Wird vom .NET-Thread-Pool verwaltet. |
423
+
|**Rückgabewert**| Kein direkter Rückgabewert. Ergebnisse müssen über gemeinsame Variablen oder Callbacks verarbeitet werden. | Kann ein Ergebnis mit `Task<TResult>` zurückgeben. |
424
+
|**Stornierung**| Keine native Unterstützung. Muss manuell implementiert werden. | Unterstützt Abbruch über `CancellationToken`. |
425
+
|**Async-Unterstützung**| Nicht für `async`/`await` geeignet. | Vollständig integrierbar mit `async`/`await`. |
426
+
|**Ressourcenverbrauch**| Teurer, da jeder Thread eigene Ressourcen verwendet. | Ressourcenschonender durch Wiederverwendung im Thread-Pool. |
427
+
|**Nebenläufigkeit**| Führt exakt einen Codepfad aus. | Kann beliebig viele Tasks gleichzeitig verwalten (abhängig von Systemressourcen). |
428
+
|**Abstraktionsebene**| Niedrig – direkte Steuerung der Threads. | Höher – Fokus auf *was* getan werden soll, nicht *wie*. |
290
429
291
-
+ Die Klasse Thread wird zum Erstellen und Bearbeiten einer Thread-Instanz verwendet. Ein Task stellt eine asynchrone Operation dar und ist Teil der Task Parallel Library, einer Reihe von APIs zur asynchronen und parallelen Ausführung von Tasks.
292
-
+ Der Task kann ein Ergebnis zurückgeben. Es gibt keinen direkten Mechanismus, um das Ergebnis von einem Thread zurückzugeben.
293
-
+ Task unterstützt die Stornierung durch die Verwendung von Storno-Tokens, Thread hingegen nicht.
294
-
+ Ein Task kann mehrere Prozesse gleichzeitig ablaufen lassen. Bei Threads kann immer nur eine Aufgabe gleichzeitig laufen.
295
-
+ Mit den Schlüsselwörtern 'async' und 'await' können wir Asynchronous leicht implementieren.
296
-
+ Ein neuer Thread() hat nichts mit dem Thread-Pool zu tun, während jeder Task durch den Thread-Pool verwaltet wird.
297
-
+ Ein Task ist ein Konzept auf höherer Ebene als ein Thread.
298
430
299
431
### Task-Klasse
300
432
@@ -365,7 +497,6 @@ public class Example
365
497
Thread.CurrentThread.ManagedThreadId);
366
498
};
367
499
368
-
// Create a task but do not start it.
369
500
Taskt1=newTask(action, "alpha");
370
501
t1.Start();
371
502
Console.WriteLine("t1 has been launched. (Main Thread={0})",
0 commit comments