2008-09-08 6 views
9

私はSTAモードであるために私を強制的にUIコンポーネントを含んでWCFサービスを提供しています。STA(シングルスレッド)

サービス動作をSTAモードに設定するにはどうすればよいですか?


このサービスでは、画像解析のためのUIウィンドウ(ビューポートとして使用)を開くWPF DLLファイルへの参照を使用します。サービスは、その項目のインスタンスを作成しようとした場合(窓から継承)それは例外をスロー:

呼び出し元のスレッドがSTA

答えて

0

でなければならない私は、[STAThread]属性を使用して調査しますスレッドモデルを切り替えます。例:

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

Description of the STAThread attribute

しかし、あなたがすべてで、WebサービスにUIコンポーネントを使用している理由は、私は混乱しています。あなたはこれをやろうとしている理由についてもう少し説明できますか?

+1

私はこのコメントがもう少し遅くなることを知っていますが、このアプローチを使用しないでください!基本的には、これによりファイナライザスレッドでデッドロックが発生し、ファイナライズが機能しなくなりリソースリークが発生します。すぐに詳細を追加するURLを追加します。 – Mihailo

+0

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

1

私はあなたに似たようなことをしています。

私のソリューションは、ルートにSTAスレッドキューを介してすべてのコールでした。新しいparallel frameworkのスレッドセーフコレクションを使用して、STAスレッドで実行したいアクションをキューに入れました。その後、実行する新しいアクションのキューを継続的にチェックするX個のSTAスレッドがありました。

+1

そして、今、私はちょうどカスタム[のSynchronizationContext](http://msdn.microsoftを使用しています。 com/ja-ko/magazine/cc163321.aspx#S4)を今すぐ使用してください。はるかに良い解決策。 – Will

0

ServiceBehaviour属性を使用すると、動作を指定することができます。シングルスレッドのためのあなたのケースでは、以下を使用します。

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

あなたmight want to read about differentInstanceContextMode秒あなたはより良いあなたは、サービスが動作するようにしたいどのように選択するのに役立ちます。

あなたはまた、あなたのapp.config新しいサービスの振る舞いに追加する(または1つの既存の編集)する必要があります。

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

希望:次のように同じapp.configセットbehaviorConfigurationで

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

とあなたの行動の設定でこれで時間が節約されます

関連する問題