9

UI コンポーネントを含む WCF サービスを使用しているため、強制的に STA モードになります。

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


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

呼び出しスレッドは STA でなければなりません

4

3 に答える 3

1

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

私の解決策は、STA スレッド キューを介してすべての呼び出しをルーティングすることでした。新しい並列フレームワークのスレッドセーフ コレクションを使用して、STA スレッドで実行したいアクションをキューに入れました。次に、新しいアクションを実行するためにキューを継続的にチェックする X 個の STA スレッドがありました。

于 2008-09-08T13:10:17.117 に答える
0

[STAThread] 属性を使用してスレッド モデルを切り替えることを検討します。例えば

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

STAThread 属性の説明

しかし、Web サービスで UI コンポーネントを使用している理由がまったくわかりません。なぜこれをやろうとしているのか、もう少し説明できますか?

于 2008-09-08T10:48:43.647 に答える
0

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>

これで時間を節約できることを願っています

于 2016-05-09T15:31:34.747 に答える