我有5个这样的任务:
private async Task<List<Places>> GetPlaces()
{
Stopwatch sw = new Stopwatch();
sw.Start();
var list5 = await GetPlacesTask();
sw.Stop();
Testowybox3.Text = sw.Elapsed.ToString()+" get places times";
return list5;
}
private async Task<List<Categories>> GetCategories()
{
Stopwatch sw = new Stopwatch();
sw.Start();
var list5 = await GetCategoriesTask();
sw.Stop();
Testowybox2.Text = sw.Elapsed.ToString()+" get categories times";
return list5;
}
它们的返回值与例如我的第二个任务:
private async Task<EventsInstance[]> GetDetailedData()
{
Stopwatch sw = new Stopwatch();
sw.Start();
list4 = await GetDetailedDataTask();
List<EventsListPrint> lista = new List<EventsListPrint>();
foreach (var VARIABLE in list4)
{
lista.Add(new EventsListPrint() { Date = string.Format("{0:dd.MM.yyyy}", VARIABLE.startDate.Date), Time = VARIABLE.startDate.TimeOfDay.ToString(), Category = VARIABLE.categoryId.ToString(), Where = VARIABLE.organizer.designation, What = VARIABLE.name });
}
fruitdatagrid2.ItemsSource = lista;
sw.Stop();
Testowybox.Text = sw.Elapsed.ToString()+" get detailed data times";
return list4;
}
private async Task<List<Organizers>> GetOrganizers()
{
Stopwatch sw = new Stopwatch();
sw.Start();
var list5 = await GetOrganizersTask();
sw.Stop();
Testowybox4.Text = sw.Elapsed + " get orgzanizers times";
return list5;
}
他们正在从网上解析Jsons。我正在收集他们的数据:
var DetailedDataList = await GetDetailedData();
var CategoriesList = await GetCategories();
var PlacesList = await GetPlaces();
var OrganizersList = await GetOrganizers();
var EventsList = await GetEvents();
我如何确保他们完成所有工作?我试过了:
Task.WhenAll(GetDetailedData(), GetCategories(), GetPlaces(), GetOrganizers(), GetEvents());
但似乎我无法检索值。我真正想要实现的是创建方法,该方法将意识到成功完成任务,然后在我的WPF GUI中操作此数据。我可以把它们连在一起,但我不知道怎么做。一切正常,只要我使用其中一个返回的列表。当尝试使用另一个列表在一个列表上执行linq时,有可能另一个列表尚未准备好,它只会使我的应用程序崩溃。
答案 0 :(得分:2)
当你await Task.WhenAll
时,当线路恢复时,你可以确信所提供的任务将处于完成状态。
var detailedDataTask = GetDetailedData();
var categoriesTask = GetCategories();
//etc
await Task.WhenAll(detailedDataTask, categoriesTask); //etc
但是,包含任务(detailedDataTask
)的变量仍为Task<T>
。不是他们包装的类型,T
。
我们如何打开已完成的任务?
我们可以(不直观,但最好)await
完成的任务:
var detailedData = await detailedDataTask;
或(因为我们知道任务已经完成)我们可以直接转到.Result
属性而不用担心阻塞......
var detailedData = detailedDataTask.Result;
由于运行时解开异步异常时会发生额外的魔法,因此您可能应该首选await
。