2013-06-08 27 views
5

Tôi có một phương thức được gọi thường xuyên từ nhiều luồng. Nó liên quan đến việc ghi vào đĩa bằng cách sử dụng await FileIO.WriteTextAsync. Đây hoạt động tốt khi nó được gọi từ một chủ đề duy nhất, nhưng một khi tôi bắt đầu làm điều này trong nhiều chủ đề, tôi nhận được lỗi này:Ứng dụng Metro FileIO.WriteTextAsync Nhiều chủ đề

The process cannot access the file because it is being used by another process. 

Tôi biết những gì lỗi nghĩa, nhưng tôi không chắc chắn làm thế nào để làm việc xung quanh nó. Thông thường, tôi sẽ tạo một câu lệnh lock(object), để đảm bảo rằng tệp đang được truy cập bởi chỉ một luồng tại một thời điểm. Tuy nhiên, đây là một phương pháp không đồng bộ và vì vậy tôi không thể sử dụng toán tử await trong phần nội dung của câu lệnh lock(object).

Vui lòng thông báo về cách xử lý trường hợp này.

Trả lời

6

Bạn có thể sử dụng SemaphoreSlim để hoạt động như một async khóa -tương thích:

SemaphoreSlim _mutex = new SemaphoreSlim(1); 

async Task MyMethodAsync() 
{ 
    await _mutex.WaitAsync(); 
    try 
    { 
    ... 
    } 
    finally 
    { 
    _mutex.Release(); 
    } 
} 

Cá nhân, tôi không thích những finally, vì vậy tôi thường viết của riêng tôi IDisposable để phát hành các mutex khi xử lý, và tôi mã có thể trông giống như sau:

async Task MyMethodAsync() 
{ 
    // LockAsync is an extension method returning my custom IDisposable 
    using (await _mutex.LockAsync()) 
    { 
    ... 
    } 
} 
+0

Vâng Stephen không có gì lạ khi bạn có danh tiếng lớn như vậy. Các giải pháp và liên lạc cá nhân của bạn với nó là tuyệt vời. Quá trình của tôi đang chạy hoàn hảo ngay bây giờ. Tôi cũng đã sử dụng đề xuất của bạn để tăng cường lớp đăng nhập của tôi đang gặp vấn đề tương tự. Cảm ơn vì điều đó! – c0D3l0g1c

+0

Bạn được chào đón! –