我使用ADO.NET DataService的在Silverlight应用程序和自Silverlight库不支持对IQueryable的我想这可能是可能创造解决这个名为SilverlightToList扩展方法ToList()()调用。因此,在这个方法中,我号召我的背景下,BeginExecute方法如下:

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

的问题是,当我调用的WaitOne()方法,这导致死锁。这是在Silverlight ADO.NET DataService的的限制吗?有没有可能是一种解决方法呢?

有帮助吗?

解决方案 2

我因为发现在这个帖子 MSDN论坛里面说,任何managed-> UnManaged->管理编组发生在UI线程这解释了为什么的WaitOne方法调用挂...

这是

其他提示

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

基本IDEEA是产卵一个服务员螺纹(最后一块),其将必须等待对象的引用。不要把你的电话了WaitAll在调用方法/线程,因为这会导致死锁的其他人早在本网站或其他网站上提到。

发生死锁,因为线程不开始直到该方法结束,并且该方法并没有结束,因为子线程的为WaitAll呼叫等待结束。

不在我的情况下上述然而,因为为WaitAll是另一个线程上。

PS:取而代之的是使用R1和R2捕捉这将保存数据或引用//做你的事行地方代码无效,如果该结果失败。

Silverlight的可能是不会喜欢任何同步,因为它的目的是在浏览器中运行,并且它只能有一个线程玩 - 它必须共享。并且仅可用于主机的螺纹是由浏览器所提供的一个。

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-我们/库/ cc838191(VS.95)的.aspx

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top