2008-09-08 36 views
9

Tôi có dịch vụ WCF bao gồm các thành phần giao diện người dùng, buộc tôi phải ở chế độ STA.Cách tạo một dịch vụ WCF STA (đơn luồng)

Làm cách nào để đặt hành vi dịch vụ thành chế độ STA?


Dịch vụ sử dụng tham chiếu đến tệp DLL WPF mở cửa sổ giao diện người dùng (được sử dụng làm cổng xem) để phân tích hình ảnh. Khi dịch vụ đang cố gắng để tạo ra một thể hiện của mục đó (kế thừa từ cửa sổ) nó ném một ngoại lệ:

Các thread gọi phải có một STA

Trả lời

0

tôi sẽ điều tra bằng cách sử dụng [STAThread] thuộc tính để chuyển đổi mô hình luồng. ví dụ:

[STAThread] 
static void Main() 
{ 
     ServiceBase[] ServicesToRun; 
     ServicesToRun = new ServiceBase[] { new Host() }; 
     ServiceBase.Run(ServicesToRun); 
} 

Description of the STAThread attribute

Nhưng tôi đang bối rối tại sao bạn đang sử dụng các thành phần giao diện người dùng trong một dịch vụ web nào cả. Bạn có thể giải thích thêm một chút về lý do tại sao bạn đang cố gắng làm điều này?

+1

Tôi biết nhận xét đến trễ một chút, nhưng dù sao - không sử dụng cách tiếp cận này! Về cơ bản, điều này sẽ gây ra bế tắc với chuỗi Finalizer để hoàn tất sẽ không hoạt động gây ra rò rỉ tài nguyên. Tôi sẽ thêm url với nhiều chi tiết hơn. – Mihailo

+0

http://stackoverflow.com/questions/2001667/net-windows-service-needs-to-use-stathread – GregC

1

Tôi đang làm điều gì đó tương tự như bạn.

Giải pháp của tôi là định tuyến tất cả các cuộc gọi thông qua hàng đợi chuỗi STA. Tôi đã sử dụng bộ sưu tập luồng an toàn từ parallel framework mới để xếp hàng Hành động tôi muốn chạy trên chuỗi STA. Sau đó tôi đã có X số chủ đề STA liên tục kiểm tra hàng đợi cho các hành động mới để thực thi.

+1

Và bây giờ, tôi chỉ đang sử dụng [SynchronizationContext] tùy chỉnh (http://msdn.microsoft). com/en-us/magazine/cc163321.aspx # S4) cho điều này ngay bây giờ. Giải pháp tốt hơn nhiều. – Will

0

ServiceBehaviour thuộc tính cho phép bạn chỉ định hành vi. Trong trường hợp của bạn cho chủ đề duy nhất bạn sẽ sử dụng như sau:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.PerCall)] 
public class Service : IService 
{ 
} 

Bạn might want to read about differentInstanceContextMode s để giúp bạn tốt hơn chọn vào cách bạn muốn dịch vụ để hành xử.

Bạn cũng cần phải thêm vào app.config hành vi dịch vụ mới của bạn (hoặc chỉnh sửa hiện có):

<behavior name="wsSingleThreadServiceBehavior"> 
     <serviceThrottling maxConcurrentCalls="1"/> 
    </behavior> 

và trong cấu hình hành vi của bạn trong cùng một app.config bộ behaviorConfiguration như sau:

<service behaviorConfiguration="wsSingleThreadServiceBehavior" name="IService"> 
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="wsEndpointBinding" name="ConveyancingEndpoint" contract="IService" /> 
    </service> 

Hope điều này giúp bạn tiết kiệm thời gian

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