【问题标题】:Async callback thread lock in Silverlight WCFSilverlight WCF 中的异步回调线程锁
【发布时间】:2013-02-10 01:52:55
【问题描述】:

我想出了一个关于如何伪造 SL WCF 对同步调用的支持的想法。

基本上,

private _completed;
private IList<Customer> _customers;
public void IList<Customer> GetAllCustomers()
{
    bool completed = false;
    DataServiceQuery<Customer> myQuery = this.Context.Customers;
    myQuery.BeginExecute(OnQueryExecuted, myQuery);

    while (!_completed)
      System.Threading.Thread.Sleep(67); //tried join also

    return _customers;
}

private void OnQueryExecuted(IAsyncResult result)
{
     var query = result.AsyncState as DataServiceQuery<Customer>;
    _customers = query.EndExecute(result).ToList();
    _isCompleted = true;
}

发生的事情是这个永远循环。

我在 while 循环上设置了一个断点,将其移出并继续执行,然后在下一毫秒结果到达。

所以,我认为接收结果的查询回调会排队到调用查询的同一线程。

SL 似乎非常坚决地保持这种行为,所以即使我将myQuery.BeginExecute 包装在一个新线程中,我仍然会得到相同的行为。

/*edit:实际上,考虑一下,它在等待的ui线程上排队回调。这也是我们得到结果时不必Dispatcher.Invoke 的原因。无论如何,我总是可以在专用线程中完成整个操作(需要等待),然后在那里等待,但这需要进行大量重构,避免尝试这样做的重点。 */

有没有办法解决这个问题?

【问题讨论】:

  • 你以一种或另一种方式阻塞了 UI 线程,而不是循环,为什么不直接调用 Execute 呢?这个方法GetAllCustomers永远不会以你现在拥有的形式异步,所以只需调用Execute。我不太明白为什么你试图参与第二个线程而不是只阻塞一个线程 - 根本没有任何好处,它会降低你的应用程序性能。你能详细说明一下吗?
  • 关键是它不是异步的。由于myQuery.BeginExecute,db 调用是异步的。无论如何,如果我打电话给Execute,Silverlight 会突然通知我它不支持同步查询。
  • 哦,我明白了,我不知道,让我看看周围..
  • :) 请。感谢您的宝贵时间。
  • 这里是你的上下文中的example,你只需要 1 个等待句柄。

标签: c# wcf silverlight iasyncresult


【解决方案1】:

这个挂起的原因是 EndExecute 方法编组到 UI 线程,但是你用 Sleep 调用阻塞了 UI 线程。不管你使用什么技术来阻塞线程,你所做的任何事情都会导致死锁,因为该方法是在 UI 线程中调用的。

在 SIlverlight 环境中进行开发时,您需要能够异步编程,而不是使用同步方法。如果您使用的是 C# 5.0,则可以使用 async/await 功能,该功能可让您编写 看似同步的异步代码,但它将被编译为利用回调/延续的异步调用,这就是您的如果您尚未升级到该版本,则需要这样做。

【讨论】:

  • 那么,如果他们允许在 Win 应用程序中阻塞 UI 线程,为什么不在 SL 中呢?毕竟,您将进行测试,如果出现问题,您将异步执行。无论如何,这些事情会在 100 毫秒内返回。这不仅仅是将所有内容都作为延续的问题,现在我必须对一堆事情进行并发检查。如果用户单击刷新某些数据列表,那么我应该禁用从中加载元素,直到它返回.. 等等。async/await 很棒,但不能解决这个问题。
  • 我能得到什么?零!我还可以将等待时间限制为 133 毫秒,声明服务器无响应并向用户显示错误。对于小型往返。像任何理智的人一样,我会做更大的异步。但是,好的,让过去成为过去吧,现在让我们的所有 db trips 随时随地异步进行。
  • @h.alex 关键是阻塞 UI 线程会冻结整个应用程序。您阻止执行绘制事件,阻止用户移动浏览器,阻止他们导航或切换选项卡。这对用户体验极为不利。
猜你喜欢
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多