【发布时间】: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