Je suis venu avec une idée sur la fausse prise en charge SL WCF pour les appels synchrones.Verrouillage de thread de rappel asynchrone dans Silverlight WCF
Fondamentalement,
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;
}
Ce qui se passe est que cette boucles pour toujours.
Je place un point d'arrêt sur la boucle while, je l'éloigne et je reprends l'exécution, et les résultats arrivent dans la milliseconde suivante.
Alors, je pense que le rappel de la requête pour recevoir les résultats obtient en file d'attente au même thread la requête a été invoqué.
SL semble très déterminé à maintenir ce comportement, même si j'Enroulez le myQuery.BeginExecute
dans un nouveau thread, j'ai toujours le même comportement.
/* edit: en fait, en y réfléchissant, il met en attente le rappel sur le thread ui, qui attend. C'est aussi la raison pour laquelle nous n'avons pas à Dispatcher.Invoke
lorsque nous obtenons les résultats. de toute façon, je peux toujours faire l'ensemble de l'opération (qui nécessite l'attente) dans un fil dédié, puis attendre là, mais cela nécessitera un tas de refactoring, évitant ce qui est le point d'essayer cela. */
Y at-il un moyen de contourner cela?
vous bloquez le thread UI d'une façon ou d'une autre, au lieu de boucler pourquoi ne pas simplement appeler 'Execute'? Cette méthode 'GetAllCustomers' ne sera jamais asynchrone de toute façon dans la forme que vous avez maintenant, alors appelez simplement' Execute' à la place. Je ne comprends pas pourquoi vous essayez d'impliquer dans le deuxième thread au lieu de bloquer un seul thread - il n'y a aucun avantage du tout et il dégrade les performances de l'application. Pourriez-vous élaborer un peu plus? – user1416420
le point est pour qu'il ne soit pas asynchrone. l'appel db est asynchrone à cause du 'myQuery.BeginExecute'. de toute façon, si j'appelle 'Execute', Silverlight m'informe brusquement qu'il ne supporte pas l'interrogation synchrone. –
oh, je vois, je ne savais pas cela, laissez-moi regarder autour .. – user1416420