Từ khóa đang chờ trong C # (.NET Async CTP) không được phép trong câu lệnh khóa.
Từ MSDN :
Không thể sử dụng biểu thức chờ trong hàm đồng bộ, trong biểu thức truy vấn, trong khối bắt hoặc cuối cùng của câu lệnh xử lý ngoại lệ, trong khối của câu lệnh khóa hoặc trong ngữ cảnh không an toàn.
Tôi cho rằng điều này là khó khăn hoặc không thể cho nhóm biên dịch thực hiện vì một số lý do.
Tôi đã thử làm việc với câu lệnh bằng cách sử dụng:
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();
}
Tuy nhiên điều này không hoạt động như mong đợi. Cuộc gọi đến Monitor.Exit trong ExitDis Dùng một lần. Dường như chặn vô thời hạn (hầu hết thời gian) gây ra bế tắc khi các luồng khác cố lấy khóa. Tôi nghi ngờ sự không đáng tin cậy của công việc của tôi xung quanh và lý do chờ tuyên bố không được phép trong tuyên bố khóa có liên quan nào đó.
Có ai biết tại sao chờ đợi không được phép trong cơ thể của một tuyên bố khóa?