我想出了一个关于如何伪造 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
在一个新线程中,我仍然会得到相同的行为。
/*编辑:实际上,考虑一下,它在等待的ui线程上排队回调。Dispatcher.Invoke
这也是我们得到结果时不必这样做的原因。无论如何,我总是可以在专用线程中完成整个操作(需要等待),然后在那里等待,但这需要进行大量重构,避免尝试这样做的重点。*/
有没有办法解决?