Ich verwende WebClient, um einige JSON-Daten vom Server abzurufen. Und ich möchte, dass es synchron ist (ja, ich weiß, dass in WP alles async sein sollte, aber ich brauche es aus irgendeinem Grund synchronisieren). In meiner Klasse habe ich Code wie folgt:WebClient - Antwort mit großen Daten synchronisieren
private WebClient _webClient;
private string _acctualResponse;
private AutoResetEvent _lock = new AutoResetEvent(false);
void _webClient_UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)
{
_acctualResponse = e.Result;
_lock.Set();
}
public string _message;
public string SendString(string URL, string message)
{
_webClient.UploadStringAsync(new Uri(URL), message);
_lock.WaitOne();
return _acctualResponse;
}
In meinem Programm verwende ich es ein paar anderen Datensatz zu erhalten. Und alles funktioniert OK, während die Rückgabedaten klein sind. Wenn ich größere Daten bekommen muss (3 img in base64), werden Ereignisse nicht gestartet. ABER! wenn ich _lock löste, Ereignis immer einen Moment nach SendString
Funktion beginnt, ist vorbei. Ich versuche, einige andere Mechanismen zu verwenden, um auf eine Antwort zu warten, z. while
Schleife:
private void WaitForResponse()
{
_acctualRequestTime = 0;
_acctualResponse = null;
while (!_uploadComplet && _acctualRequestTime < Timeout)
{
int slepTime = 200;
Thread.Sleep(slepTime);
_acctualRequestTime += slepTime;
}
_uploadComplet = false;
}
[natürlich in Ereignis i einstellte _uploadComplete
Flag auf true] Efect war das gleiche: Antwort kam eine kurze nach Timeout, egal welche Timeout-Zeit eingestellt wurde. Ich bin ein bisschen verwirrt durch diese Situation. Weißt du, was ich schlecht mache?
Sie rennen gegen die erwartete asynchrone Designphilosophie, aber Sie sagen nicht warum. Vielleicht könnten Sie Ihren Grund dafür aufschreiben, und wir könnten Ihnen eine Antwort geben, die Ihr Problem löst, aber Sie müssen nicht durch diese Reifen springen? –