2010-04-11 5 views
3

J'ai une application multithread en C# qui essaie d'écrire dans un TextBox dans un Windows.Forms créé par un autre thread.Aide nécessaire avec InvokeRequired pour Web.UI

Comme les threads ne peuvent pas modifier ce qui n'a pas été créé par eux, j'utilisais InvokeRequired comme indiqué sur le code ci-dessous, pour résoudre ce problème.

public delegate void MessageDelegate(Communication message); 
void agent_MessageReceived(Communication message) 
{ 
    if (InvokeRequired) 
    { 
     BeginInvoke(new MessageDelegate(agent_MessageReceived), new object[] { message }); 
    } 
    else 
    { 
     TextBox1.Text += message.Body; 
    } 
} 

Maintenant, je dois faire la même chose pour une zone de texte dans une application ASP.NET, mais apparemment ni InvokeRequired ni BeginInvoke existent pour TextBox dans un Web.UI. Que puis-je faire?

Répondre

0

Si vous essayez de faire ce que je pense, alors ce n'est pas possible. Si votre gestionnaire d'événements est appelé par un processus d'arrière-plan sur le serveur, comment pouvez-vous éventuellement mettre à jour une zone de texte? Quelle zone de texte mettriez-vous à jour? Les zones de texte que vous essayez de mettre à jour sont toutes sur le navigateur Web du client et non sur votre serveur.

Quoi qu'il en soit, la réponse à votre question est qu'il n'y a pas de méthode InvokeRequired ou Invoke, car les contrôles ASP.NET ne sont pas accessibles à travers les threads. Seul un thread traitant actuellement une requête web peut accéder aux éléments de la page en cours de traitement.

Vous devrez repenser votre approche. Vous ne pouvez pas vraiment faire des choses dans une application Web de la même manière que vous le feriez pour une application de bureau.

+0

Merci, c'était très utile. Je sais maintenant que l'approche doit être changée. Avez-vous une suggestion? – Ali

+0

Désolé pour la réponse tardive. Je n'ai pas remarqué votre commentaire. Une alternative possible si vous avez une opération longue est d'utiliser le traitement de page asynchrone dans ASP.NET. http://msdn.microsoft.com/en-us/magazine/cc163725.aspx ou vous pourriez utiliser quelque chose comme un mécanisme d'interrogation Ajax. – Josh

2

Je pense que vous n'avez pas besoin de cela sur l'interface Web. Chaque client reçoit son propre TextBox et le WebServer ne réutilise pas le TextBox pour plus d'une demande. Est-ce que quelque chose me manque?

+0

Donc, dites-vous que dans Web.UI si le thread un fait un TextBox, le thread deux peut le modifier directement? – Ali

+0

Non. Ce que je dis, c'est que lorsque vous développez sur le Web, il n'y a aucune situation où 2 threads modifient le même TextBox en même temps. – Ikaso

+0

OK, j'ai compris ce que vous voulez dire, mais ce que je me demande c'est d'abord sur une application Web, un thread peut-il modifier directement un contrôle effectué par un autre thread, mais pas nécessairement en même temps? et si oui, comment? – Ali