多个任务的时刻在返回不同对象时结束

时间:2018-03-26 00:29:32

标签: c# asynchronous parallel-processing async-await task

我有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时,有可能另一个列表尚未准备好,它只会使我的应用程序崩溃。

1 个答案:

答案 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