2009-03-18 28 views
5

Trong .NET làm thế nào tôi có thể biết một lớp hoặc phương pháp là luồng an toàn hay không? Theo mặc định, chuỗi này có an toàn không?Có thuộc tính nào để đánh dấu lớp hoặc phương thức là luồng an toàn trong .NET không?

+0

Bạn muốn thuộc tính nào để phục vụ? – AnthonyWJones

+1

Có thể là một loại tài liệu mã để cảnh báo cho người sử dụng lớp –

+0

Nếu anh ta chỉ muốn tài liệu, anh ta có thể đặt nó trong phần . –

Trả lời

6

Đây không phải là thuộc tính cho điều này: bạn phải đọc tài liệu cho mỗi mục mà bạn quan tâm. Bạn không thể tạo chủ đề an toàn chỉ bằng cách thêm thuộc tính vào nó. Điều đó giống như dùng một quả cam và đặt một nhãn dán trên đó nói rằng, "Apple".

Tất nhiên, điều tương tự cũng đúng đối với việc tuần tự hóa và không dừng ở đó, nhưng vẫn: không có thuộc tính. Đọc tài liệu.

+0

Tất cả các phương thức và thuộc tính tĩnh được giả định là luồng an toàn theo mặc định (ví dụ: trừ khi được ghi lại khác), ví dụ: là họ không. – Richard

+0

Giả sử một phương pháp không phải là chủ đề an toàn khi nó không gây hại, giả sử một là thread an toàn khi không thể gây khó chịu. Tốt hơn của bạn để giả định không có gì là thread an toàn trừ khi được chỉ định. – JoshBerke

1

Tôi lấy lại được Joel Coehoorn trên trang này, có thể dễ dàng giả mạo như vậy.

Tại sao không thêm nội dung thread trong mô tả chức năng

+0

Tôi sẽ không lo lắng quá nhiều về việc "giả mạo" nó. Nhưng đồng thời là khó khăn: nó sẽ rất có khả năng là một lỗi đã trượt qua và thuộc tính đó chỉ là không chính xác. –

+2

Nhưng nếu thuộc tính không đúng, có thể tài liệu (nếu có) sẽ không chính xác. –

+0

Tôi hoàn toàn đồng ý với @JimMischel, nhưng Joel không phải là người ủng hộ tài liệu. Ít nhất thuộc tính có thể đọc được máy, cho phép, ở mức tối thiểu, liệt kê tự động, lọc, báo cáo vv của các phương pháp được phân bổ, và thậm chí có khả năng một số dạng phân tích tĩnh và/hoặc phòng ngừa lỗi yếu.Thuộc tính là con đường để đi, nhưng bạn cần một hệ thống phức tạp và toàn diện của chúng để nắm bắt ngữ nghĩa đồng thời theo bất kỳ cách thực sự hữu ích nào. Đối với .NET, tôi không biết về bất kỳ thiết kế hoặc đề xuất nào như vậy. –

-1

Không có kịch bản trường hợp sử dụng thực hiện một lớp đồng bộ, theo như phương pháp là có liên quan bạn sử dụng sau mã hóa phong cách:

using System.Runtime.CompilerServices; 
[MethodImpl(MethodImplOptions.Synchronized)] 
void MyMethod() 
{ 
DoSomething(); 
} 
+0

Vấn đề là; điều đó vẫn không ngụ ý rằng phương thức này là an toàn luồng - bởi vì một luồng khác có thể gọi một phương thức khác mà * không * có [MethodImpl], do đó, trashing lẫn nhau. Tương tự như vậy, ngay cả khi tất cả các trường là chỉ đọc, các trường trên đối tượng con có thể thay đổi và gây ra sự cố. –

+0

Ngay cả khi cái gọi là "phong cách mã hóa" * có thể * biểu thị một cái gì đó (xem nhiều ý kiến ​​khác trên trang này), cờ 'MethodImplOptions.Synchronized' có ý nghĩa trái ngược với những gì OP đang tìm kiếm. Lá cờ này có nghĩa là để chỉ ra rằng phương pháp ** không ** thread an toàn. Từ tài liệu: "Phương thức này có thể được thực hiện bởi chỉ một luồng tại một thời điểm." –

1

Nó có thể thực hiện tất cả quyền truy cập vào đối tượng nối tiếp của bạn qua IContributeObjectSink/IContextAttribute mặc dù điều này sẽ bị ảnh hưởng lớn bởi vì nó sẽ yêu cầu đối tượng của bạn để phân lớp MarshalByRefObject, phí tạo ngữ cảnh, v.v ...

1

Không, và nó sẽ là vô nghĩa.

Giả sử tôi có một sợi Danh sách an toàn, nó có ba Chủ đề Safe ™ phương pháp:

void Add(something); 
void Remove(index); 
int GetCount(); 
something GetElementAt(index); 

Chủ đề một:

for 1 to 100 do 
list.Add(12); 

Chủ đề hai và ba:

while(list.GetCount() >0) 
{ 
    list.Remove(0); 
} 

Mã trên sẽ sụp đổ (sớm hay muộn) vì danh sách có thể thay đổi giữa thời gian bạn gọi GetCountRemove

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