Was wäre die beste Alternative für das erwarten Schlüsselwort in .NET 4.0? Ich habe eine Methode, die nach einem asynchronen Vorgang einen Wert zurückgeben muss. Ich habe festgestellt, dass die Methode wait() den Thread vollständig blockiert, wodurch die asynchrone Operation unbrauchbar wird. Welche Optionen habe ich, um den asynchronen Vorgang auszuführen, während der UIhread weiterhin freigegeben wird?Erwarten Sie eine Alternative in .NET 4.0?
Antwort
Ich denke, Ihre grundlegenden Optionen
sind- Mit
Task
und.ContinueWith()
- Async Mit CTP und
async
/await
- Reactive Extensions
Der einfachste Weg, wahrscheinlich die Installation unter Verwendung von Asynchrones CTP. Soweit ich weiß, erlaubt die Lizenz kommerzielle Nutzung. Es patcht den Compiler und kommt mit einer 150kb DLL, die Sie in Ihr Projekt aufnehmen können.
Sie können Task
und .ContinueWith()
verwenden. Das heißt aber, dass Sie sich mit Ausnahme- und Ablaufkontrolle etwas anstrengen müssen.
Aufgaben sind ein funktionales Konstrukt. Deshalb passt ContinueWith()
nicht gut mit imperativen Konstrukten wie for
Loops oder try-catch
Blöcken. Daher wurden async
und await
eingeführt, damit der Compiler uns helfen kann.
Wenn Sie diese Unterstützung des Compilers nicht haben können (d. H. Sie verwenden. NET 4.0), ist Ihre beste Wette, die TAP zusammen mit einem funktionalen Rahmen zu verwenden. Reactive Extensions ist ein sehr guter Rahmen um asynchrone Methoden zu behandeln.
Googeln Sie einfach für "reaktive Erweiterungen Tasks", um loszulegen.
Sie könnten ein Verhalten wie await
mit den yield
Coroutinen implementieren, ich benutze dies in nicht-4.5-Code. Sie benötigen eine YieldInstruction
Klasse, die von der Methode abgerufen wird, die Asynchron ausgeführt werden soll:
public abstract class YieldInstruction
{
public abstract Boolean IsFinished();
}
Dann müssen Sie einige Implementierungen des YieldInstruction
(ae TaskCoroutine
, die eine Aufgabe übernimmt) und es auf diese Weise (Pseudo-Code) verwenden:
public IEnumerator<YieldInstruction> DoAsync()
{
HttpClient client = ....;
String result;
yield return new TaskCoroutine(() => { result = client.DownloadAsync(); });
// Process result here
}
Jetzt benötigen Sie einen Scheduler, der die Ausführung der Anweisungen behandelt.
for (Coroutine item in coroutines)
{
if (item.CurrentInstruction.IsFinished())
{
// Move to the next instruction and check if coroutine has been finished
if (item.MoveNext()) Remove(item);
}
}
Wenn WPF oder WinForms-Anwendungen entwickeln, sind Sie auch in der Lage alle Invoke
Anrufe zu vermeiden, wenn Sie die Koroutinen zum richtigen Zeitpunkt aktualisieren. Sie könnten auch in der Lage sein, die Idee zu erweitern, um Ihr Leben noch einfacher zu machen. Beispiel:
public IEnumerator<YieldInstruction> DoAsync()
{
HttpClient client = ....;
client.DownloadAsync(..);
String result;
while (client.IsDownloading)
{
// Update the progress bar
progressBar.Value = client.Progress;
// Wait one update
yield return YieldInstruction.WaitOneUpdate;
}
// Process result here
}
- 1. Erwarten Observable in Net 4.0 mit Microsoft.Bcl.Async
- 2. async/erwarten Schlüsselwörter nicht in .net 4.0
- 3. Erwarten Sie mit. NET 4.0: sinnvolle Stack-Traces
- 4. Mit erwarten SemaphoreSlim.WaitAsync in .NET 4
- 5. enthält .NET 4.5. NET 4.0
- 6. Exception.ToString in .NET 4.0 gebrochen?
- 7. Installieren Sie .NET 4.0 dll zum GAC
- 8. System.Refelection.Assembly.CreateInstance in .NET 4.0 zerlegt
- 9. Asynchron-Timeout-Implementierung armen mans Asynchron mit/erwarten Konstrukte in .Net 4.0
- 10. So lesen Sie eine .RTF-Datei mit .NET 4.0
- 11. ninject .net 4.0
- 12. Wird .NET 4.0 mit Microsoft.Jet.OLEDB.4.0 geliefert?
- 13. . Net 4.0 HttpClient Nutzung?
- 14. Svcutil.exe für .NET 4.0?
- 15. Garbage Collection in .Net 4.0
- 16. Typabweichung in .NET Framework 4.0
- 17. SecurityAction.RequestMinimum ist in .Net 4.0
- 18. Multithread-Formularanwendung (.NET 4.0)
- 19. Log4Net und .NET 4.0
- 20. log4net mit .NET 4.0
- 21. Async/erwarten mit task.run vs task.run und contintwith in. NET
- 22. Eine wirklich gute RichTextBox Alternative für .NET
- 23. Enthält .NET 4.0 .NET 2.0 nicht?
- 24. 404,2 Fehler nach .net 4.0
- 25. ZooKeeper Alternative für .net
- 26. .net Dll zeigt Framework 4.0 nach 4.5.2
- 27. EmitCalli .net Kern alternative
- 28. .Net 4.0 System.Web.Security.MembershipProvider mehrdeutige Referenz?
- 29. NHibernate unterstützt .NET 4.0 Framework?
- 30. Brechen von Änderungen in .NET 4.0
Verwendung erwarten, aber in der richtigen Weise, denke ich. Sie haben etwas Code? – lboshuizen
Ist es akzeptabel, VS2012 mit C# 5.0 beim Targeting von .net 4.0 zu verwenden? Siehe [Verwenden von async-await auf .net 4] (http://stackoverflow.com/questions/9110472/using-async-await-on-net-4) – CodesInChaos
@CodesInChaos Für Mitarbeiter, nein :). – Dante