UI コンポーネントを含む WCF サービスを使用しているため、強制的に STA モードになります。
サービスの動作を STA モードに設定するにはどうすればよいですか?
このサービスは、画像分析用の UI ウィンドウ (ビュー ポートとして使用) を開く WPF DLL ファイルへの参照を使用します。サービスがその項目のインスタンスを作成しようとすると (ウィンドウから継承)、例外がスローされます。
呼び出しスレッドは STA でなければなりません
UI コンポーネントを含む WCF サービスを使用しているため、強制的に STA モードになります。
サービスの動作を STA モードに設定するにはどうすればよいですか?
このサービスは、画像分析用の UI ウィンドウ (ビュー ポートとして使用) を開く WPF DLL ファイルへの参照を使用します。サービスがその項目のインスタンスを作成しようとすると (ウィンドウから継承)、例外がスローされます。
呼び出しスレッドは STA でなければなりません
私はあなたと同じようなことをしています。
私の解決策は、STA スレッド キューを介してすべての呼び出しをルーティングすることでした。新しい並列フレームワークのスレッドセーフ コレクションを使用して、STA スレッドで実行したいアクションをキューに入れました。次に、新しいアクションを実行するためにキューを継続的にチェックする X 個の STA スレッドがありました。
[STAThread] 属性を使用してスレッド モデルを切り替えることを検討します。例えば
[STAThread]
static void Main()
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] { new Host() };
ServiceBase.Run(ServicesToRun);
}
しかし、Web サービスで UI コンポーネントを使用している理由がまったくわかりません。なぜこれをやろうとしているのか、もう少し説明できますか?
ServiceBehaviour属性を使用すると、動作を指定できます。シングルスレッドの場合、次を使用します。
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.PerCall)]
public class Service : IService
{
}
サービスの動作方法をより適切に選択するために、さまざまな について読みたいと思うかもしれません 。InstanceContextMode
また、新しいサービスの動作に追加するapp.config
(または既存のものを編集する) 必要があります。
<behavior name="wsSingleThreadServiceBehavior">
<serviceThrottling maxConcurrentCalls="1"/>
</behavior>
app.config
そして、次のような同じセットのbehaviorConfigurationの動作構成で:
<service behaviorConfiguration="wsSingleThreadServiceBehavior" name="IService">
<endpoint address="" binding="wsHttpBinding" bindingConfiguration="wsEndpointBinding" name="ConveyancingEndpoint" contract="IService" />
</service>
これで時間を節約できることを願っています