2010-07-25 5 views
2

code:- Threads ResetEvent et WebClient

public string GetTextWebRequest(string url) 
    { 
     WebClient cl = new WebClient(); 
     cl.DownloadStringCompleted += new DownloadStringCompletedEventHandler(cl_DownloadStringCompleted); 
     cl.DownloadStringAsync(new Uri(url)); 
     are.WaitOne(); 
     return _textdata; 
    } 

    void cl_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
    { 
     _textdata = e.Result; 
     are.Set(); 
    } 

Pourquoi suis-je pas en utilisant la méthode de 'DownloadString'? Parce que j'utilise le framework compact, et async est la seule option que j'ai.

Quoi qu'il en soit, mon problème est que 'DownloadStringCompleted' n'est pas appelé si le thread principal (appelant) est bloqué. Et ainsi ne se débloque jamais. Mes seules réflexions sont que WebClient appelle 'DownloadStringCompleted' sur le thread appelant, ce qui n'a pas de sens?

Je suis un peu perdu.

Répondre

1

Mes seules pensées est que WebClient est appeler « DownloadStringCompleted » sur le fil d'appel, qui ne fait pas sens?

Mais c'est exactement ce qui se passe. Il est mal documenté mais cette méthode + événement suit le modèle du backgroundworker. Vous pouvez voir la relation dans les membres DownloadStringCompletedEventArgs.

Le modèle Bgw est utilisé à divers endroits dans la bibliothèque WinForms (-related). Voir par exemple le contrôle PictureBox. Donc, conclusion: ne bloquez pas ... Vous devrez concevoir une approche axée sur les événements.

+0

ahhh, je le pensais. Eh bien merci pour la confirmation. – Peanut