2012-10-24 38 views
17

Đó là cách tiếp cận của tôi không sử dụng các phương thức và lớp tĩnh trong các hoạt động không đồng bộ - trừ khi một số kỹ thuật khóa được thực hiện để ngăn chặn các điều kiện chủng tộc.Tôi nên sử dụng phương pháp/lớp tĩnh trong các hoạt động không đồng bộ/chờ đợi như thế nào?

Hiện không đồng bộ/chờ đợi đã được đưa vào khung C# 4.5+ - đơn giản hóa các ứng dụng đa luồng và khuyến khích giao diện người dùng đáp ứng.

Tuy nhiên - như một khóa không thể/không nên được đặt trên một phương pháp chờ đợi (và tôi không tranh luận rằng) bây giờ làm cho phương pháp tĩnh sử dụng async/chờ đợi hoàn toàn dư thừa?

+0

Gọi phương thức tĩnh từ nhiều luồng sẽ không sao nếu không có bất kỳ tác dụng phụ nào. –

+0

Nếu một phương pháp có tác dụng phụ thì nó không nên tĩnh ở nơi đầu tiên, vì nó vi phạm các hướng dẫn mà nhà nước có thể thay đổi toàn cục nên tránh. – CodesInChaos

+0

@CodesInChaos Tôi không nghĩ rằng bạn có thể * vi phạm * nguyên tắc ;-) Dù bằng cách nào, điểm tôi đã cố gắng thực hiện là khóa sẽ không được yêu cầu cho hầu hết các phương pháp tĩnh, trừ khi một số loại trạng thái chia sẻ đang bị đột biến. OP đã không cung cấp đủ thông tin về mặt trận đó, và dường như ngụ ý khóa vì nó là tĩnh, không khóa cho quản lý nhà nước. –

Trả lời

31

Cách tiếp cận của tôi không sử dụng các phương thức và lớp tĩnh trong các hoạt động không đồng bộ - trừ khi một số kỹ thuật khóa được thực hiện để ngăn chặn điều kiện chủng tộc.

Tại sao? Trừ khi bạn đang thực sự sử dụng trạng thái được chia sẻ, không nên có bất kỳ điều kiện chủng tộc nào. Ví dụ, hãy xem xét:

public static async Task<int> GetPageLength(string url) 
{ 
    string text = await new WebClient().DownloadStringTaskAsync(url); 
    return text.Length; 
} 

Nếu bạn làm đã chia sẻ trạng thái - hoặc nếu bạn đang ở trong một phương pháp dụ về một trường hợp được sử dụng bởi nhiều chủ đề - bạn cần phải làm việc ra làm thế nào bạn sẽ lý tưởng là muốn hoạt động không đồng bộ của bạn hoạt động. Một khi bạn đã quyết định làm thế nào các chủng tộc khác nhau nên hành xử, thực sự thực hiện nó cũng có thể khá đơn giản.

+0

Xin lỗi - tôi thực sự có nghĩa là phương pháp tĩnh với trạng thái chia sẻ - sẽ cập nhật câu hỏi của tôi để cung cấp ví dụ –

+2

@PatrickMcCurley: Trong trường hợp đó không quá nhiều "tĩnh" mà vấn đề - đó là "nhiều chủ đề muốn sử dụng cùng một trạng thái chia sẻ ". Điều đó có thể xảy ra dễ dàng như trong các thành viên cá thể, khi các cá thể được chia sẻ giữa các trạng thái. –

+1

Trên thực tế có suy nghĩ về câu trả lời ban đầu của bạn Tôi bắt đầu nghi ngờ sự hiểu biết của tôi về những gì sẽ xảy ra khi một phương pháp tĩnh được gọi. Nếu một biến cục bộ được khai báo trong một phương thức tĩnh và 2 luồng vào phương thức tĩnh cùng một lúc - điều đó có thể không dẫn đến các điều kiện chủng tộc cho đối tượng được khai báo cục bộ không? –

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