Bir kilit ifadesinden C # (.NET Async CTP) içindeki anahtar kelimeye izin verilmez.
Kimden MSDN :
Beklenen bir ifade, bir eşzamanlı işlevde, bir sorgu ifadesinde, bir istisna işleme ifadesinin yakalama veya son olarak bloğunda, bir kilit ifadesinin bloğunda veya güvenli olmayan bir bağlamda kullanılamaz.
Bunun, derleyici ekibinin bir nedenden dolayı uygulaması zor ya da imkansız olduğunu düşünüyorum.
Using ifadesi ile bir çalışma girişiminde bulundu:
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();
}
Ancak bu beklendiği gibi çalışmaz. ExitDisposable.Dispose içinde Monitor.Exit çağrısı, diğer iş parçacıkları kilidi almaya çalıştıkça süresiz olarak (çoğu zaman) kilitlenmelere neden oluyor gibi görünüyor. Etrafımdaki çalışmanın güvenilmezliğinden ve kilit ifadesinde ifadeleri beklememe nedeninin bir şekilde ilişkili olduğundan şüpheleniyorum.
Bir kilit ifadesi içinde neden beklemeye izin verilmediğini bilen var mı ?