J'ai le code suivant dans une bibliothèque de classes. Et j'attends un rappel dans mon application principale. Je fais un appel DownloadStringAsync donc je dois attendre quelques secondes pour obtenir le rappel après qu'il a fini. J'ai un 3 de ces appels à attendre, donc dans mon application principale j'utilise AutoResetEvent pour attendre tous pour finir. Donc, je vais bloquer jusqu'à ce qu'ils aient été définis dans la fonction de rappel. Cependant, après avoir testé le rappel, vous ne serez pas appelé. Je pense quand le code est bloqué par le AutoResetEvent son blocage du DownloadStringAsync. Comme quand je commente ce code tout fonctionne bien.C# Filetage et utilisation de AutoResetEvent
Donc, je pense dès que je fais un appel à: objNoGateway.NoGatewayStatus (sipUsername, statusDisplay1.PhoneNumber); Et quand le code atteint ici: handle.WaitOne(); Il va bloquer le code dans la bibliothèque de classes.
Merci beaucoup pour tout conseil.
Dans mon exemple de code de bibliothèque de classes.
// Event handler that makes a call back in my main application
// Event handler and method that handles the event
public EventHandler<NoGatewayEventArgs> NoGatewayCompletedEvent;
// The method that raises the event.
private void OnNoGatewayCompleted(object sender, NoGatewayEventArgs e)
{
if (NoGatewayCompletedEvent != null)
{
NoGatewayCompletedEvent(this, e);
}
}
// Start the Async call to find if NoGateway is true or false
public void NoGatewayStatus(string sipUsername, string phoneNumber)
{
string strURL = string.Format("http://xxxxxxxxxxxxxxx={0}&CalledNumber={1}", sipUsername, phoneNumber);
if (!wc.IsBusy)
{
try
{
string errorMsg = string.Empty;
wc.DownloadStringAsync(new Uri(strURL));
}
catch (WebException ex)
{
Console.WriteLine("IsNoGateway: " + ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("IsNoGateway: " + ex.Message);
}
}
else
{
Console.WriteLine("WebClient: IsNoGateWay(): Busy please try again");
}
}
void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
if (e.Error == null)
{
if (e.Result == "No gateway")
{
OnNoGatewayCompleted(this, new NoGatewayEventArgs(validateResponse_e.VALIDATION_FAILED));
Console.WriteLine("NoGatway() DownloadedCompleted: " + e.Result);
}
else
{
OnNoGatewayCompleted(this, new NoGatewayEventArgs(validateResponse_e.OK));
Console.WriteLine("NoGateway() DownloadCompleted: " + e.Result);
}
}
else
{
this.OnNoGatewayCompleted(this, new NoGatewayEventArgs(validateResponse_e.SERVER_FAILED));
Console.WriteLine("No Gateway: DownloadCompleted() Error: " + e.Error.Message);
}
}
Dans mon application principale, j'inscris ce rappel. Et attendez le pour le résultat. Ensuite, définissez l'AutoResetEvent.
ManualResetEvent[] waitValidateCallResponse = new ManualResetEvent[]
{ new ManualResetEvent(false), new ManualResetEvent(false), new ManualResetEvent(false) };
// Event handler for NoGateway event
private void OnNoGatewayCompleted(object sender, NoGatewayEventArgs e)
{
Console.WriteLine("OnNoGatewayComleted: " + e.noGateway);
waitValidateCallResponse[0].Set();
}
La partie lorsque j'appelle et bloque.
NoGateway objNoGateway = new NoGateway()
objNoGateway.NoGatewayCompletedEvent += new EventHandler<NoGatewayEventArgs>(this.OnNoGatewayCompleted);
objNoGateway.NoGatewayStatus(sipUsername, statusDisplay1.PhoneNumber);
// Block here - Wait for all reponses to finish before moving on
waitEvent.WaitOne(5000, true);
Console.WriteLine("All thread finished");
======================== Modifier et a ajouté les 2 autres callbacks ne pas confondre la question de moi juste avoir une seule ======================
private void OnCalledNumberBlockedCompleted(object sender, CalledNumberBlockedEventArgs e)
{
Console.WriteLine("OnCalledNumberBlockedCompleted: " + e.CalledNumberBlocked);
waitValidateCallResponse[1].Set();
}
private void OnValidTelephoneNumberCompleted(object sender, ValidTelephoneNumberEventArgs e)
{
Console.WriteLine("OnValidTelephoneNumberCompleted: " + e.validTelephoneNumber);
waitValidateCallResponse[2].Set();
}
Selon votre code, vous devriez lire sur la console "events.WaitOne():" + handle.ToString() exactement une fois avant de pendre. Vous n'en avez pas parlé dans votre message, mais c'est un indice précieux. Alors, est-ce arrivé? – DonkeyMaster
Cette ligne n'est jamais atteinte: Console.WriteLine ("events.WaitOne():" + handle.ToString()); – ant2009
Si je devais déboguer cela, je serais passé par le débogueur. Pouvez-vous nous dire quelles lignes de code s'exécutent et lesquelles ne le font pas? Les rappels sont-ils en cours d'exécution? La méthode wc_DownloadStringCompleted est-elle exécutée? Dans votre code, vous n'avez pas montré où les méthodes OnValidTelephoneNumberCompleted et OnCalledNumberBlockedCompleted sont appelées. En outre, cela m'irrite: public EventHandler NoGatewayCompletedEvent; et plus loin ... NoGatewayCompletedEvent (this, e); Eh bien, cela ne devrait pas compiler, vous n'avez pas écrit le mot-clé "événement". Mais il n'a probablement rien à faire. –
DonkeyMaster