Czy ktoś mógłby wyjaśnić różnicę między tymi dwoma stwierdzeniami:Jak mogę produkować zadanie <Task> do otwierania
Task<Task> bTask = backup.BackupCurrentDatabaseAsync()
.ContinueWith(_ => CompressArchiveAsync());
//unwrap the tasks to produce one entire task
Task t = bTask.Unwrap();
vs
Task<Task> bTask = backup.BackupCurrentDatabaseAsync()
.ContinueWith(_ =>
{
CompressArchiveAsync();
});
//unwrap the tasks to produce one entire task
Task t = bTask.Unwrap();
Metody ExtractArchiveAsync()
, BackupCurrentDatabaseAsync()
, RestoreDatabaseAsync()
wszyscy zwracają Task
.
Tutaj pierwsza kontynuacja zwraca wartość Task<Task>
. Mogę wtedy wykonać zadanie Kontynuacja wypadkowego (wewnętrznego) zadania.
Druga wersja nie jest kompilowana. Jedyną różnicą jest tu nawias wokół urządzenia CompressArchiveAsync()
.
Próbuję uzyskać dostęp do wypadkowej (wewnętrznej) Task
, aby sprawdzić Task.Status
. Jeśli używam drugiej metody, Task.Status raportuje wynik zadania BackupCurrentDatabaseAsync()
.
Side UWAGA: rozważyć przeniesienie do 4,5 i async/awiat, jeśli to możliwe ... Wytworzy łatwiejszy do odczytania kod ... –
Niestety nadal na 4! Jak powyższe byłoby osiągnąć w 4,5? – Simon
'async' /' await' jest głównym elementem C# 5.0. Chociaż działa tylko po wyjęciu z pudełka podczas kierowania na platformę .NET 4.5, możesz użyć pakietu kierowania asynchronicznego, aby [przenieść go do .NET 4.0] (http://stackoverflow.com/questions/9110472/using-async-await-on -net-4). – CodesInChaos