Silverlight 4 アプリのデータの取得に苦労しています。My View は何らかの情報を取得する必要があるため、DataProvider を呼び出します。My DataProvider が Oracle を呼び出します。これはコールバックを必要とする非同期呼び出しであるため、DataProvider メソッドはそれを待つ必要があります。ただし、非同期呼び出しの後に DataProvider メソッドに Thread.Sleep ループを配置すると、コールバックはヒットしません。Thread.Sleep ループを削除すると、コールバックがヒットしますが、それまでに DataProvider メソッドは何も返さずに終了しています。
非同期性は、View にとっては何の価値もありません。次に進むには、この時点でこのデータが必要です。私が理解したいと思っているのは、ビューからの 1 つの要求に応答して DataProvider クラスに多数のデータベース呼び出しを行わせ、準備が整うまで戻らないようにする方法です。この場合、ビューが応答しないことは気にしません。しかし、私がやっている方法は、アプリを完全にロックすることです。
これは私が持っているものです:
ビューは次の呼び出しを行います。
m_Data = m_DataProvider.GetMyStuffData( some parameters to filter the data );
DataProvider はパラメーターを認識し、m_Data オブジェクトの構築を開始します。これにはいくつかの呼び出しが必要で、そのうちの 1 つが次のようになります。
public override List<MyStuff> GetMyStuff( DateTime _startDay, DateTime _endDay )
{
var rc = new List<MyStuff>( );
m_WaitingForData = true;
var query = MyQueryString;
var parameters = new string[ ] { "My Parameter" };
getOracleData(parameters, query, "My Query ID");
while (m_WaitingForData)
{
Thread.Sleep( 20 );
}
// process Data which asynchronous call put into a member variable.
return rc;
}
getOracleData は非同期呼び出しを行い、コールバックを GetTable に接続します。
コールバック メソッド GetTable は、GetMyStuff が予期しているメンバー変数にデータを抽出し、m_WaitingForData をオフにして終了します。