동기 호출에 대해 SL WCF 지원을 위조하는 방법에 대한 아이디어가 떠 올랐습니다. 기본적으로 Silverlight 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
할 필요가없는 이유이기도합니다. 여하튼, 전 항상 전용 스레드에서 전체 작업 (기다림이 필요함)을 수행 한 다음 기다릴 수는 있지만,이 작업을 시도하는 시점을 피하면서 리팩토링이 필요합니다. */
이 방법이 있습니까?
'Execute'를 호출하지 않고 왜 UI 스레드를 차단하고 있습니까? 이 메소드'GetAllCustomers'는 여러분이 가지고있는 형태로 결코 비동기 적이되지 않으므로 대신'Execute'를 호출하십시오. 왜 하나의 스레드를 차단하는 대신 두 번째 스레드에 참여하려고하는지 전혀 알지 못합니다. 이점은 전혀 없으며 응용 프로그램 성능이 저하됩니다. 좀 더 자세히 설명해 주시겠습니까? – user1416420
포인트는 비동기가 아닙니다. db 호출은'myQuery.BeginExecute' 때문에 async입니다. 어쨌든, 내가'Execute '를 호출하면 Silverlight는 동기식 쿼리를 지원하지 않는다는 사실을 갑자기 알려줍니다. –
오, 알았어, 나는 몰랐어. 주변을 둘러 볼까 .. – user1416420