0

どんな助けでも大歓迎です。

メソッドを呼び出すWCFサービス(IISでホストされている)があり、このメソッド内で依存関係プロパティのゲッターへの呼び出しがあります(このゲッターは単一のオブジェクトに収集され、すべてに使用されるいくつかの依存関係プロパティの一部です一種の変換)。

WCFサービス側でクラッシュが発生することがありますが、一貫性がありません。次の例外メッセージが表示されます。

別のスレッドがオブジェクトを所有しているため、呼び出し元のスレッドはこのオブジェクトにアクセスできません」。

私はいくつかの検索を行い、同様の問題を見つけました。

読んだことから、ゲッターが別のスレッドで呼び出されるシナリオがあることがわかりました。そのため、この例外が常に発生するわけではありません。

しかし、私はまだ解決策に戸惑っています。WCFサービスには、CheckAccess()をアクティブ化してからDispatcher.Invoke()メソッドを呼び出すことができるディスパッチャーがありますか(WPFアプリケーションの場合と同様)?

誰かアドバイスしてもらえますか?

ありがとう、

エラッド

4

3 に答える 3

0

できることは、DispatcherObjectから継承する「プライマリ」スレッドにクラスを作成することです。これにより、WCF の Dispatcher プロパティにアクセスできるようになります。

于 2013-03-05T18:06:19.297 に答える
0

すべての DependencyObject にはスレッド アフィニティがあります。それらは、それをインスタンス化したスレッドによってのみアクセスできます。DependencyObject.CheckAccess() を呼び出して、正しいスレッド上にあるかどうかを判断します。これが例です。コードでは Button を使用していますが、Button は依然として DependencyObject です。

private void TryToUpdateButtonCheckAccess(object uiObject)
{
    Button theButton = uiObject as Button;

    if (theButton != null)
    {
        // Checking if this thread has access to the object
        if(theButton.CheckAccess())
        {
            // This thread has access so it can update the UI thread
            UpdateButtonUI(theButton);
        }
        else
        {
            // This thread does not have access to the UI thread
            // Pushing update method on the Dispatcher of the UI thread
            theButton.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
                new UpdateUIDelegate(UpdateButtonUI), theButton);
        }
    }
}
于 2013-02-28T05:35:16.750 に答える
0

問題は複数のスレッド間で依存関係プロパティにアクセスすることであるため、WCF サービスで STA スレッド モデルを使用できます。

この記事では、アプローチについて説明します

http://www.netfxharmonics.com/2009/07/Accessing-WPF-Generated-Images-Via-WCF

関連するセクションは記事の終わり近くにあります。彼はあなたの正確な問題を説明しているようです。

于 2013-03-05T18:29:18.020 に答える