Ich baute einige async/erwarten Demo-Konsole App und seltsames Ergebnis bekommen. Code:C# async/erwarten seltsames Verhalten in der Konsole App
class Program
{
public static void BeginLongIO(Action act)
{
Console.WriteLine("In BeginLongIO start... {0} {1}", (DateTime.Now.Ticks - ticks)/TimeSpan.TicksPerMillisecond, Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(1000);
act();
Console.WriteLine("In BeginLongIO end... \t{0} {1}", (DateTime.Now.Ticks - ticks)/TimeSpan.TicksPerMillisecond, Thread.CurrentThread.ManagedThreadId);
}
public static Int32 EndLongIO()
{
Console.WriteLine("In EndLongIO start... \t{0} {1}", (DateTime.Now.Ticks - ticks)/TimeSpan.TicksPerMillisecond, Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(500);
Console.WriteLine("In EndLongIO end... \t{0} {1}", (DateTime.Now.Ticks - ticks)/TimeSpan.TicksPerMillisecond, Thread.CurrentThread.ManagedThreadId);
return 42;
}
public static Task<Int32> LongIOAsync()
{
Console.WriteLine("In LongIOAsync start... {0} {1}", (DateTime.Now.Ticks - ticks)/TimeSpan.TicksPerMillisecond, Thread.CurrentThread.ManagedThreadId);
var tcs = new TaskCompletionSource<Int32>();
BeginLongIO(() =>
{
try { tcs.TrySetResult(EndLongIO()); }
catch (Exception exc) { tcs.TrySetException(exc); }
});
Console.WriteLine("In LongIOAsync end... \t{0} {1}", (DateTime.Now.Ticks - ticks)/TimeSpan.TicksPerMillisecond, Thread.CurrentThread.ManagedThreadId);
return tcs.Task;
}
public async static Task<Int32> DoAsync()
{
Console.WriteLine("In DoAsync start... \t{0} {1}", (DateTime.Now.Ticks - ticks)/TimeSpan.TicksPerMillisecond, Thread.CurrentThread.ManagedThreadId);
var res = await LongIOAsync();
Thread.Sleep(1000);
Console.WriteLine("In DoAsync end... \t{0} {1}", (DateTime.Now.Ticks - ticks)/TimeSpan.TicksPerMillisecond, Thread.CurrentThread.ManagedThreadId);
return res;
}
static void Main(String[] args)
{
ticks = DateTime.Now.Ticks;
Console.WriteLine("In Main start... \t{0} {1}", (DateTime.Now.Ticks - ticks)/TimeSpan.TicksPerMillisecond, Thread.CurrentThread.ManagedThreadId);
DoAsync();
Console.WriteLine("In Main exec... \t{0} {1}", (DateTime.Now.Ticks - ticks)/TimeSpan.TicksPerMillisecond, Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(3000);
Console.WriteLine("In Main end... \t\t{0} {1}", (DateTime.Now.Ticks - ticks)/TimeSpan.TicksPerMillisecond, Thread.CurrentThread.ManagedThreadId);
}
private static Int64 ticks;
}
Das Ergebnis Gebrüll:
Vielleicht erwarte ich nicht vollständig verstehen, was genau macht. Ich dachte, wenn die Ausführung wartet, dann kehrt die Ausführung zu der Aufrufermethode und Aufgabe zum Warten auf Läufe in einem anderen Thread zurück. In meinem Beispiel werden alle Operationen in einem Thread ausgeführt und die Ausführung kehrt nach dem await-Schlüsselwort nicht zur Aufrufermethode zurück. Wo ist die Wahrheit?
können Sie sehen folgendermaßen aus: https: //channel9.msdn.com/Shows/Going+Deep/Mads-Torgersen-Inside-C-Async – Chaka
'Ich dachte, wenn die Ausführung dann die Ausführung kehrt zu erwarten kommt an die Aufrufer-Methode und Task für wartende Läufe in einem anderen Thread. Jedes einzelne 'async' Intro, das mir bekannt ist (einschließlich [meiner] (http://blog.stephencleary.com/2012/02/async-and-await .html)) geht aus dem Weg, dies explizit zu sagen * ist nicht * was passiert. –