2009-09-16 29 views

Trả lời

0

Không, bởi vì bạn sẽ không bao giờ muốn thực hiện việc này. Bạn đang thực sự cố gắng đạt được điều gì?

EDIT

Dựa trên nhiều thông tin hơn, đây là những gì tôi nghĩ.

Nếu bạn chỉ muốn "trạng thái dính" theo yêu cầu, bạn nên sử dụng trạng thái trên Instance và sử dụng InstanceContextMode.PerCall, theo phản hồi của marc_s.

Nếu bạn cần trạng thái lưu trữ cục bộ cho cuộc gọi, bạn có thể xem xét sử dụng ICallContextInitializer làm cách để sắp xếp trạng thái qua chuỗi mà WCF chọn để gọi phương thức của bạn (và làm sạch trạng thái luồng khi cuộc gọi kết thúc).

Nhưng bạn không nên quan tâm đến "chuỗi nào". WCF sẽ xử lý với một hồ bơi thread thay cho bạn.

+0

Bạn có thể giải thích thêm một chút không? –

+0

Ý tưởng là chia sẻ các phiên db, thông tin đăng nhập, v.v. trong một yêu cầu bằng cách lưu trữ chúng trong ThreadContext. Điều này sẽ giúp chúng tôi trong việc thực hiện rollbacks, v.v. – Nazgul

+0

tất nhiên bạn có thể - nó thực sự thậm chí là thực hành tốt nhất được đề nghị! ServiceHost có một nhóm các chủ đề công nhân cho mục đích chính xác này –

6

Có bạn có thể làm điều đó - nó được gọi là xử lý yêu cầu "cho mỗi cuộc gọi". ServiceHost sẽ tạo một phiên bản mới của lớp dịch vụ của bạn cho mỗi yêu cầu đến để xử lý một yêu cầu đó.

Để làm điều này, bạn cần phải thiết lập lớp dịch vụ của bạn (một trong những thực hiện giao diện dịch vụ) là "PerCall" - bạn làm điều này bằng cách áp dụng một thuộc tính trên lớp dịch vụ của bạn:

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)] 
public class YourService : IYourService 
{ 
... 
} 

Marc

+0

Thao tác này sẽ tạo một cá thể Dịch vụ mới cho mỗi cuộc gọi, nhưng không sinh ra một chuỗi mới cho mỗi cuộc gọi. – Nazgul

+0

nhưng nó sẽ gán cá thể dịch vụ mới cho một chuỗi công nhân để xử lý yêu cầu ...... –

+1

Tôi không nghĩ rằng bạn có thể làm nhiều hơn thế này. Tôi không biết về bất kỳ thiết lập nào trong WCF để tạo một chuỗi mới hoàn toàn cho mỗi yêu cầu. Và tại sao bạn thực sự muốn ?? Tạo một luồng đầy đủ là một hoạt động khá tốn kém - tại sao không sử dụng nhóm chủ đề công nhân tích hợp sẵn có? –

3

Phụ thuộc vào chính xác những gì bạn muốn, nhưng hành vi dịch vụ sau đây sẽ giải quyết nó:

ServiceBehavior: 
ConcurrencyMode=ConcurrencyMode.Multiple 
InstanceContextMode=InstanceContextMode.Single 

lớp học của bạn sẽ là một singleton, nhưng tất cả các cuộc gọi được thực hiện với phương pháp này sẽ chạy trong một separ ăn sợi. Nếu bạn cần bất kỳ đồng bộ hóa mặc dù bạn phải làm điều đó bằng tay.

Cũng đừng quên xem xét việc điều chỉnh để biết các vấn đề về hiệu suất tiềm năng.

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