我正在努力获取 Silverlight 4 应用程序的数据。我的视图需要获取一些信息,因此它会调用我的 DataProvider。我的 DataProvider 调用 Oracle。这是一个需要回调的异步调用,所以我的 DataProvider 方法需要等待它。但是,如果我在异步调用之后在我的 DataProvider 方法中放置一个 Thread.Sleep 循环,则回调永远不会命中。如果我删除 Thread.Sleep 循环,回调会命中,但到那时我的 DataProvider 方法已经完成,没有任何东西可以返回。
异步性对 View 没有价值;它此时必须拥有这些数据才能继续前进。我希望能够弄清楚的是,如何让 DataProvider 类进行多次数据库调用以响应来自视图的一个请求,并且在它准备好之前不返回。在这种情况下,我不介意视图没有响应;但我这样做的方式是完全锁定应用程序。
这就是我所拥有的:
该视图进行此调用:
m_Data = m_DataProvider.GetMyStuffData( some parameters to filter the data );
DataProvider 识别参数并开始构建 m_Data 对象。这需要多次调用,其中一个如下所示:
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,然后退出。