9
  1. Chủ đề .NET System.Net.CookieContainer có an toàn không? - Cập nhật: Chìa khóa trao tay được trả lời -
  2. Có cách nào để đảm bảo an toàn luồng cho các biến được sửa đổi trong các yêu cầu không đồng bộ (ví dụ HttpWebRequest.CookieContainer) không?
  3. Có thuộc tính nào để đánh dấu các lớp an toàn chủ đề không? - Cập nhật: Nếu độ an toàn của luồng được mô tả trên MSDN thì có thể chúng không có thuộc tính cho điều này -
  4. Tất cả các lớp .NET đều an toàn không? - Cập nhật: Marc answered--

tôi hỏi những câu hỏi này bởi vì tôi sử dụng CookieContainer trong các yêu cầu không đồng bộ trong một mã đa luồng. Và tôi không thể đặt một yêu cầu hỗn độn trong một cái khóa. Có lẽ tôi sẽ phải sử dụng chỉ đọc "biến" (hoặc loại bất biến) như trong F #, phải không?Chủ đề .NET System.Net.CookieContainer có an toàn không?

+0

Tôi sẽ cập nhật lại lần thứ 2, chỉ để đánh dấu mọi thứ ... –

Trả lời

4

Không, không phải tất cả các lớp .NET đều an toàn. Trong thực tế, rất ít người có nhu cầu. Nói chung, các thành viên tĩnh nên được an toàn thread, nhưng đó là về nó.

Đối tượng không thể thay đổi/bán bất biến được tự động chỉ an toàn (bao gồm các thứ như XslTransform v.v.) - và có một vài trường hợp có thể thay đổi (chẳng hạn như các thùng chứa luồng) nơi bạn có thể mong đợi các chủ đề an toàn. MSDN cho biết thread-safety cho mỗi lớp.

Tôi sẽ không có kỳ vọng cho một hộp chứa cookie được an toàn chỉ, vì vậy bạn có thể sẽ phải đồng bộ hóa chính nó.

(đã cập nhật)

Làm lại điểm thứ hai của bạn; chính xác bạn đang nghĩ đến các biến nào? Biến trạng thái cục bộ của riêng bạn sẽ không được cập nhật trực tiếp trong yêu cầu không đồng bộ, do đó, nó đơn giản rơi vào bạn để đồng bộ hóa quyền truy cập khi chuẩn bị yêu cầu khi xử lý câu trả lời. Phổ biến nhất, thông qua một Monitor - tức là

lock(syncLock) { 
    // prepare request from (synchronized) state 
    req.Begin{...} 
} 

và sau đó trong callback

lock(syncLock) { 
    // ...read values from request... 
    // ...update local state... 
} 

đâu syncLock chỉ là một đối tượng khóa (có lẽ tổ chức chống lại một ví dụ):

private readonly object syncLock = new object(); 
+0

Tôi không biết chính xác HttpWebRequest.CookieContainer điểm nào được cập nhật, nhưng tôi đoán là trong yêu cầu không đồng bộ. –

+0

Vâng, bạn có cần thực hiện các yêu cầu đồng thời từ cùng một đối tượng không? Bạn không thể có nhiều đối tượng HttpWebRequest với các thùng chứa cookie riêng biệt? thế thì không có xung đột. –

5

Từ horses mouth:

Chủ đề An toàn

Bất kỳ public static (chung trong Visual Basic) thành viên của loại này là chủ đề an toàn. Bất kỳ thành viên cá thể nào cũng không được bảo đảm là luồng an toàn.

Chỉnh sửa:

Bạn có thể đặt khóa xung quanh các hành động sửa đổi thành viên cá thể.

0

Tất cả các lớp tĩnh trong khung công tác .NET được đảm bảo bởi Microsoft là luồng an toàn.

Bạn có thể xác minh điều này bằng cách sử dụng Trình phản xạ.

1

Chỉ cần lưu ý, một trang web sẽ gửi danh sách cookie được sửa đổi như một phần của trả lời HTTP của nó. Sửa đổi CookieContainer sau khi trả lời đã được gửi sẽ không thực hiện bất cứ điều gì - bạn sẽ chỉ sửa đổi tập hợp cookie của một yêu cầu trang không còn tồn tại nữa.

2

Như tôi thấy (với sự trợ giúp của Trình phản xạ), CookieContainer sử dụng nội bộ khóa để truy cập các thành viên của nó, vì vậy nó phải là luồng an toàn mặc dù tài liệu.

Nhân tiện, nó không có thành viên tĩnh công khai. Vì vậy, có vẻ như với tôi rằng tài liệu chỉ cung cấp thông báo tiêu chuẩn.

+0

Và tại đây đối với lõi .net ... https://github.com/dotnet/corefx/blob/1c3a3e6aad27daf3ce53edcae1022b69ef31866c/src/System.Net.Primitives/src/System/Net/CookieContainer.cs –

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