0

いくつかの.netアセンブリを使用するウィンドウワークフローがいくつかあります。これらのワークフローウィンドウからいくつかのハードウェアにアクセスしています。仮想ディレクトリ方式を介してIISで公開されている私のXYZサービスは、これをすべて支援します。次に、これらのワークフローを.NetWebアプリケーションから使用します。wcfサービスとWebクライアントを作成しました。私のwcfサービス(Webクライアント要求)はワークフローをロードし(成功)、実行を試みます。

問題は、ロードされたワークフローの実行を呼び出すときに、「多くのUIコンポーネントがこれを必要とするため、呼び出し元のスレッドはSTAである必要がある」という例外が発生することです。

4

2 に答える 2

2

シングルスレッド アパートメント スレッドではないスレッドから WinForms/WPF オブジェクトを使用している場合、この例外が発生します。WCF サービスからこれらのオブジェクトを使用するには、新しいスレッドを作成し、そのスレッドのアパートメント状態を に設定してから、スレッドをSTA開始する必要があります。

私の簡単な例では、文字列を受け取り、それを WPF TextBox の SpellCheck 機能に対してチェックします。

public bool ValidatePassword(string password)
{
    bool isValid = false;

    if (string.IsNullOrEmpty(password) == false)
    {
        Thread t = new Thread(() =>
        {
            System.Windows.Controls.TextBox tbWPFTextBox = new System.Windows.Controls.TextBox();

            tbWPFTextBox.SpellCheck.IsEnabled = true;
            tbWPFTextBox.Text = password;
            tbWPFTextBox.GetNextSpellingErrorCharacterIndex(0, System.Windows.Documents.LogicalDirection.Forward);

            int spellingErrorIndex = tbWPFTextBox.GetNextSpellingErrorCharacterIndex(0, System.Windows.Documents.LogicalDirection.Forward);

            if (spellingErrorIndex == -1)
            {
                isValid = true;
            }
            else
            {
                isValid = false;
            }

        });

        t.SetApartmentState(ApartmentState.STA);
        t.Start();
        t.Join();
    }

    return isValid;
}

この SO 投稿も参照できます: WCF サービス STA (シングルスレッド) を作成する方法

回答のリンクと同様: http://www.netfxharmonics.com/2009/07/Accessing-WPF-Generated-Images-Via-WCF

于 2013-08-28T21:29:48.027 に答える