Das Schlüsselwort await in C# (.NET Async CTP) ist innerhalb einer Sperranweisung nicht zulässig.
Desde MSDN :
Eine await-Ausdruck kann nicht verwendet werden in einer synchronen Funktion, in einer Abfrage Ausdruck, im catch- oder finally-Block einer Ausnahmebehandlung Anweisung, im Block einer Sperranweisung oder in einem unsicheren Kontext.
Ich nehme an, dass dies für das Compiler-Team entweder schwierig oder aus irgendeinem Grund unmöglich zu implementieren ist.
Ich habe versucht, mit der using-Anweisung eine Lösung zu finden:
class Async
{
public static async Task<IDisposable> Lock(object obj)
{
while (!Monitor.TryEnter(obj))
await TaskEx.Yield();
return new ExitDisposable(obj);
}
private class ExitDisposable : IDisposable
{
private readonly object obj;
public ExitDisposable(object obj) { this.obj = obj; }
public void Dispose() { Monitor.Exit(this.obj); }
}
}
// example usage
using (await Async.Lock(padlock))
{
await SomethingAsync();
}
Dies funktioniert jedoch nicht wie erwartet. Der Aufruf von Monitor.Exit innerhalb von ExitDisposable.Dispose scheint auf unbestimmte Zeit zu blockieren (die meiste Zeit), was zu Deadlocks führt, da andere Threads versuchen, die Sperre zu übernehmen. Ich vermute, dass die Unzuverlässigkeit meines Workarounds und der Grund, warum await-Anweisungen in Lock-Anweisungen nicht zulässig sind, irgendwie zusammenhängen.
Weiß jemand por qué await ist innerhalb des Körpers einer Lock-Anweisung nicht erlaubt?
43 Stimmen
Ich könnte mir vorstellen, dass Sie den Grund gefunden haben, warum das nicht erlaubt ist.
3 Stimmen
Darf ich diesen Link empfehlen? hanselman.com/blog/ und diese hier: blogs.msdn.com/b/pfxteam/archive/2012/02/12/10266988.aspx
0 Stimmen
Ich fange gerade an, aufzuholen und lernen ein wenig mehr über async Programmierung. Nach zahlreichen Deadlocks in meinem wpf-Anwendungen, fand ich diesen Artikel zu einem großen sicheren Schutz in async Programmierung Praktiken sein. msdn.microsoft.com/de-us/magazine/
3 Stimmen
Sperre ist entworfen, um async Zugriff zu verhindern, wenn async Zugriff Ihren Code brechen würde, ergo, wenn Sie async innerhalb einer Sperre verwenden, die Sie Ihre Sperre ungültig gemacht haben. so, wenn Sie etwas innerhalb Ihrer Sperre abwarten müssen, verwenden Sie die Sperre nicht richtig
1 Stimmen
Blogs.msdn.com/b/pfxteam/archive/2012/02/12/10266988.aspx ist tot, ich glaube es ist devblogs.microsoft.com/pfxteam/ y devblogs.microsoft.com/pfxteam/ jetzt
0 Stimmen
Hier können Sie eine mögliche Lösung für Sie finden: blog.cdemi.io/async-warten-inside-c-sharp-locks