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

标签 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 数据服务的限制吗?也许有解决方法吗?

最佳答案

我已经成功地击败了 (: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..
});

基本思想是生成一个等待线程(最后一个 block ),该线程将引用等待对象。不要将 WaitAll 调用放在调用者方法/线程中,因为这会导致死锁,正如本网站或其他网站上其他人之前提到的那样。

发生死锁的原因是,直到方法结束时线程才启动,并且由于 WaitAll 调用等待子线程结束而导致方法未结束。

但在我上面的情况下并非如此,因为 WaitAll 位于另一个线程上。

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

关于silverlight - Silverlight 中的同步 ADO.NET 数据服务调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/351644/

相关文章:

.net - WCF 巢服务

WCF 服务,请求或增加 Binding 上的 SendTimeout 值

Silverlight DragDrop.DoDragDrop()

c# - Silverlight 的文件权限问题

sql-server - 如何防止 Entity Framework 在 SQL Server 中生成低效查询?

c# - Metro 应用程序通过 WCF 服务连接到 SQL - 错误

wcf - 如何提高 WCF 数据服务性能

c# - MEF:使用和从组合零件导出来满足导出零件的要求

silverlight - 如何限制 slider 的值更改事件?

wpf - VirtualizingStackPanel 的缺点是什么?