我正在尝试使用 .NET Reactive Framework 来简化对我正在编写的 Silverlight 3 应用程序使用的 WCF 服务的一些异步调用。
问题是我很难找到一种方法来以一种可行的方式构建我的代码。毫无疑问,部分问题在于理解 Reactive 中可用的机制以及如何使用它们来解决我的问题。
我正在尝试将一系列 WCF 服务器调用串在一起 - 如果它们是同步的,它们看起来像这样:
switch( CurrentVisualState )
{
case GameVisualState.Welcome:
m_gameState = m_Server.StartGame();
if( m_GameState.Bankroll < Game.MinimumBet )
NotifyPlayer( ... ); // some UI code here ...
goto case GameVisualState.HandNotStarted;
case GameVisualState.HandNotStarted:
case GameVisualState.HandCompleted:
case GameVisualState.HandSurrendered:
UpdateUIMechanics();
ChangeVisualState( GameVisualState.HandPlaceBet );
break;
case GameVisualState.HandPlaceBet:
UpdateUIMechanics();
// request updated game state from game server...
m_GameState = m_Server.NextHand( m_GameState, CurrentBetAmount );
if( CertainConditionInGameState( m_GameState ) )
m_GameState = m_Server.CompleteHand( m_GameState );
break;
}
过去的调用m_Server.XXXX()
直接在 Silveright 应用程序中实现(因此它们可以是同步的) - 但现在在 WCF 服务中实现。由于 Silverlight 强制您异步调用 WCF 服务 - 重写此代码块一直很棘手。
我希望用来Observable.FromEvent<>()
订阅XXXCompleted
WCF 代理代码生成的各种事件,但我不清楚如何让它工作。我最初的尝试看起来像:
var startObs = Observable.FromEvent<StartGameCompletedEventArgs>(
h => m_Server.StartGameCompleted += h,
h => m_Server.StartGameCompleted -= h );
startObs.Subscribe( e => { m_gameState = e.EventArgs.Result.StartGameResult;
if( m_GameState.Bankroll < Game.MinimumBet )
NotifyPlayer( ... ); // some UI code here ...
TransitionVisual( GameVisualState.HandNotStarted );
} ); // above code never reached...
m_Server.StartGameAsync(); // never returns, but the WCF service is called