2012-04-12 38 views
14

Nói rằng tôi có một phương pháp async giúp tiết kiệm sang file:Cách thực hiện tác vụ đồng bộ hóa?

async Task SaveToFileAsync() 
{ 
    var file = await folder.GetFileAsync (...) 
    var stream = file.OpenFileAsync(...) 
    ///etc 

} 

Bây giờ tưởng tượng rằng SaveToFileAsync được gọi là hai lần cùng một lúc. Đây là một vấn đề bởi vì bạn không thể viết trên cùng một tập tin cùng một lúc

Nếu đây là một phương pháp thông thường, khóa() sẽ sửa lỗi này:

void SaveToFile() 
{ 
    lock(something) 
    { 
     /// code here 
    } 
} 

Tuy nhiên, khóa không được phép trong một phương pháp async .

Tất nhiên, người ta có thể gọi Monitor.Enter() hoặc sử dụng một mutex nhưng các đối tượng này làm việc với chủ đề chứ không phải nhiệm vụ. Vì vậy họ không phải là câu trả lời.

Vì vậy, vì khóa() không phải là một tùy chọn, làm thế nào có thể đồng bộ hóa nhiều tác vụ? Cụ thể, tôi nên viết mã nào để đảm bảo rằng "SaveToFileAsync" chỉ được gọi một lần tại một thời điểm?

+0

Không phải là * "SaveToFileAsync" được gọi là chỉ một lần tại một thời điểm * nói rằng bạn muốn sử dụng phương pháp cho chính xác đối diện của những gì nó được thiết kế cho? – Khan

+0

@Jeff điều duy nhất mà nói đến cái tâm là bạn muốn lưu vào 2 tệp khác nhau một cách không đồng bộ nhưng muốn đồng bộ hóa quyền truy cập vào cùng một tệp ... – Servy

+2

Bạn có thể sử dụng hàng đợi mà một quy trình công nhân riêng biệt hoạt động. –

Trả lời

24

Đối với một cơ chế loại trừ lẫn nhau async, có một cái nhìn tại

    Building Async Coordination Primitives, Part 6: AsyncLock

Bạn có thể sử dụng AsyncLock lớp sau:

private readonly AsyncLock m_lock = new AsyncLock(); 

async Task SaveToFileAsync() 
{ 
    using (await m_lock.LockAsync()) 
    { 
     var file = await folder.GetFileAsync(...); 
     var stream = await file.OpenFileAsync(...); 
     // etc 
    } 
} 
+2

Tại sao AsyncLock (và các mẫu đồng bộ hóa khác) không phải là một phần không thể thiếu của TPL? –

+0

Bài viết 'Phần 6' không cung cấp mã sao chép/dán. Một blogger khác tập hợp ở đây tho: http://sanjeev.dwivedi.net/?p=292 –

Các vấn đề liên quan