Kata kunci yang menunggu dalam C # (.NET Async CTP) tidak diizinkan dari dalam pernyataan kunci.
Dari MSDN :
Ekspresi menunggu tidak dapat digunakan dalam fungsi sinkron, dalam ekspresi query, dalam menangkap atau akhirnya blok pernyataan penanganan pengecualian, di blok pernyataan kunci , atau dalam konteks yang tidak aman.
Saya menganggap ini sulit atau tidak mungkin dilakukan oleh tim penyusun karena beberapa alasan.
Saya mencoba menyelesaikan dengan menggunakan pernyataan:
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();
}
Namun ini tidak berfungsi seperti yang diharapkan. Panggilan ke Monitor.Keluar dalam ExitDisposable.Dispose tampaknya memblokir tanpa batas waktu (sebagian besar waktu) menyebabkan kebuntuan sebagai upaya utas lainnya untuk mendapatkan kunci. Saya menduga tidak dapat diandalkannya pekerjaan saya di sekitar dan alasan menunggu pernyataan tidak diizinkan dalam pernyataan kunci entah bagaimana terkait.
Adakah yang tahu mengapa menunggu tidak diizinkan di dalam tubuh pernyataan kunci?