0

Silverlight で Prism のイベント アグリゲーターを使用していますが、Subscribe に苦労しています。コードが Subscribe メソッドに到達すると、ハングアップするだけで、次のコード行に進むことはありません。コードを分割すると、_eventAggregator.GetEvent() はイベントの有効なインスタンスを返すようです。コードは間違いなく「購読」にかかっています。ここで何が間違っているのでしょうか?JobCompletedEvent は、別のライブラリ (このライブラリの依存関係) で宣言されています。

    public void CallMeWhenTheJobIsDone(Action callback)
    {
        if (_jobIsRunning)
            _eventAggregator.GetEvent<JobCompletedEvent>().Subscribe((e) => callback(), ThreadOption.UIThread); 
        else
            callback();
    }

    public class JobCompletedEvent: Microsoft.Practices.Prism.Events.CompositePresentationEvent<JobCompleted>
{ }
public class JobCompleted
{
}
4

2 に答える 2

0

1)なぜ使用するのですif (_jobIsRunning)か?? とにかく電話callbackます

2)Prismはあなたにイベントをもたらすだけです-そしてあなたの質問によると-Prismは上昇してあなたにイベントを渡します-それでそれはPrismの質問でcallbackはありません-呼び出されたものは何も機能していないようです。

callbackしたがって、呼び出されるものと別のことについて詳しく知る必要があります。Prismの場合、 callbackon ThreadOption.UIThreadThreadPoolを呼び出すので、呼び出すときに他のスレッドがすでにUIスレッドをロックしていないかどうかを再確認してください。callback

于 2012-04-15T13:50:38.193 に答える
0

私の問題は、サブスクライブで匿名メソッドを使用すべきではなかったことです。プリズムはそれをサポートしていないようです。これを Prism のバグと呼んでいる人もいますが、私も同意します :) 匿名メソッドを使用できないだけでなく、メソッドをパブリックにする必要があります。

グーグルで見つけた参考文献

http://greenicicleblog.com/2010/04/28/prism-event-aggregator-more-leaky-than-it-seems/

異なる ViewModel から同じ Prism コマンドを実行する

これは Prism のドキュメントのどこかにあるのではないかと思います。keepSubscriberReferenceAlice を設定すると、プライベート メソッドまたは匿名メソッドで動作します (これについて考えると、これにはある程度の意味があります)。面白いことに、私のサンドボックス プロジェクトでは、プライベート スコープのコードを使用する匿名メソッドでコンパイルすることさえできません。私のライブ プロジェクトはコンパイルできますが、実行時に失敗します。

編集: うん、ドキュメント http://msdn.microsoft.com/en-us/library/ff921122%28v=pandp.40%29.aspx ページの 2/3 にある大きな黄色いボックスにあります。

于 2012-04-15T22:29:23.600 に答える