2

我在 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

4 回答 4

3

我已经成功地击败了( :P )silverlight 中的异步怪物,如下所示:

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..
});

基本的想法是产生一个服务员线程(最后一个块),它会引用等待对象。不要将您的 WaitAll 调用放在调用方方法/线程中,因为这将导致死锁,正如本网站或其他网站前面提到的其他人一样。

发生死锁是因为线程直到方法结束才开始,并且方法没有结束,因为 WaitAll 调用等待子线程结束。

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

PS:而不是 // do your thing 行放置代码,它使用 r1 和 r2 捕获的引用,如果结果失败,它将保存数据或 null。

于 2009-10-08T08:23:28.503 回答
1

Silverlight 可能不喜欢同步的任何东西,因为它旨在在浏览器中运行,并且它只能使用一个线程来玩——而且它必须共享它。主机可用的唯一线程是浏览器提供的线程。

于 2008-12-09T02:53:23.630 回答
1

从那以后,我在 MSDN 论坛上发现了这篇文章,上面说任何托管->非托管->托管编组都发生在 UI 线程上,这解释了为什么 WaitOne 方法调用挂起......

于 2008-12-09T03:09:32.490 回答
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

于 2008-12-09T04:51:12.033 回答