ich hab in einer Konsolenanwendung eine Funktion, die Daten asynchron aus dem Internet holt.
class Program { static void Main(string[] args) { Service service = new Service(); } }
class Service { public Service() { SendStringAsync("http://myaddress/", string, new UploadValuesCompletedEventHandler(UploadValuesCompleted)); Console.WriteLine("I'll be back"); System.Threading.Thread.Sleep(3000); } }
Klar, dass der Thread dann eine Zeit pausieren muss, bis die Antwort kommt und UploadValuesCompleted aufgerufen wird.
public void UploadValuesCompleted(Object sender, UploadValuesCompletedEventArgs e) { Console.WriteLine("I am back"); Console.ReadKey(); }
Das funktioniert auch alles. Der Aufruf passiert, der Thread pausiert, Antwort kommt, UploadValuesCompleted wird aufgerufen, Console.WriteLine gibt Satz aus - und dann wartet das Programm nicht bei ReadKey() sondern verabschiedet sich. Ich bin mit meinem Latein am Ende. Was ist das los? Warum wird ReadKey() ignoriert?
Sehe ich auch so. Du musst das Console.ReadKey() im Haupt-Thread haben. Also entweder:
class Program { static void Main(string[] args) { Service service = new Service(); Console.ReadKey(); } }
oder
class Service { public Service() { SendStringAsync("http://myaddress/", string, new UploadValuesCompletedEventHandler(UploadValuesCompleted)); Console.WriteLine("I'll be back"); System.Threading.Thread.Sleep(3000); Console.ReadKey(); }
Vermutung: Weil die UploadValuesCompleted in einem separaten Thread läuft, dieser Thread ein Background-Thread ist, und der Hauptthread nicht auf Background-Threads wartet, sondern das Programm beendet, wenn er mit seinem Kram durch ist.
Der synchrone Aufruf des Service-Konstruktors kommt nach drei Sekunden zurück, danach ist Sense.