Silverlight中的同步ADO.NET数据服务调用

时间:2008-12-09 02:50:49

标签: silverlight wcf-data-services

我在Silverlight应用程序中使用ADO.NET数据服务,并且由于silverlight库不支持IQueryable上的ToList()调用,我认为可以围绕这个名为SilverlightToList()的方法创建扩展方法。所以在这个方法中,我在我的上下文中调用BeginExecute方法,如下所示:

            var result = context.BeginExecute<T>(currentRequestUri,null,context);
            result.AsyncWaitHandle.WaitOne();
            return context.EndExecute<T>(result).ToList();

问题是,当我调用WaitOne()方法时,这会导致死锁。这是Silverlight中ADO.NET数据服务的限制吗?可能有解决方法吗?

4 个答案:

答案 0 :(得分:3)

我设法击败(:P)像银光一样的异步怪物:

var ctx = new ModelEntities(new Uri("http://localhost:2115/Data.svc"));

ManualResetEvent m1 = new ManualResetEvent(false);
ManualResetEvent m2 = new ManualResetEvent(false);

var q1 = (DataServiceQuery<Department>)(from e in ctx.Department select e);
var q2 = (DataServiceQuery<Person>)(from e in ctx.Person select e);

Department[] r1 = null;
Person[] r2 = null;

q1.BeginExecute(r =>
{
    try { r1 = q1.EndExecute(r).ToArray(); }
    finally { m1.Set(); }
}, null);
q2.BeginExecute(r =>
{
    try { r2 = q2.EndExecute(r).ToArray(); }
    finally { m2.Set(); }
}, null);

ThreadPool.QueueUserWorkItem((o) =>
{
    WaitHandle.WaitAll(new WaitHandle[] { m1, m2 });
    // do your thing..
});

基本的ideea是生成一个服务器线程(最后一个块),它将引用等待对象。不要将WaitAll调用放在调用者方法/线程中,因为这会导致其他人在本网站或其他网站上提到的死锁。

发生死锁是因为线程在方法结束之前没有启动,并且方法没有结束,因为WaitAll调用等待子线程结束。

上面不是我的情况,因为WaitAll在另一个线程上。

PS:取代//使用r1和r2获取的东西行代码捕获将保存数据的引用,如果结果失败则返回null。

答案 1 :(得分:1)

Silverlight可能不会喜欢同步任何东西,因为它打算在浏览器中运行,它只能有一个线程可以玩 - 而且它必须共享它。唯一可用于主机的线程是浏览器提供的线程。

答案 2 :(得分:1)

我已经在MSDN论坛上找到了this post,其中说任何托管 - &gt; UnManaged-&gt;托管编组都会在UI线程上发生,这解释了WaitOne方法调用挂起的原因......

答案 3 :(得分:1)

Silverlight中的所有服务调用必须是异步的。所以你必须定义一个回调来获得结果 - 像这样:

context.BeginExecute<T>(currentRequestUri, resultCallback, context);

private void resultCallback(IAsyncResult asyncResult)
{
    DataServiceContext context = asyncResult.AsyncState as DataServiceContext;
    var result = context.EndExecute<T>(asyncResult);
    // Do whatever you need with the result here
}

以下是MSDN的一个很好的参考: http://msdn.microsoft.com/en-us/library/cc838191(VS.95).aspx