异步等待返回数据问题

时间:2021-04-01 02:56:16

标签: c#

所以我遇到了 C# async 和 await 的问题。我有 2 个长时间运行的函数,我想在 Windows 窗体应用程序上异步调用它们。我将它们封装在 2 个异步函数中。一个获取时区,另一个获取聚合。问题是数据以某种方式发生冲突。这些是函数:

private async void LoadAggregates()
        {
            //Load Available Aggregates
            Task<CanaryAggregate> caTask = GetAggregatesAsync();
            CanaryAggregate ca = await caTask;
            Dictionary<string, dynamic> Aggs = ca.aggregates;

            foreach (KeyValuePair<string, dynamic> item in Aggs/*PropertyDescriptor pd in TypeDescriptor.GetProperties(ca.aggregates)*/)
            {
                cbAggregate.Items.Add(item.Key);
            }

            cbAggregate.SelectedIndex = cbAggregate.FindStringExact(Properties.Settings.Default.Aggregate);
        }

        private async Task<CanaryAggregate> GetAggregatesAsync()
        {
            CanaryAggregate ca = null;
            await Task.Run(() =>
            {
                ca = Program.caAPI.getAggregates();
            });
            return ca;
        }
        private async void LoadTimeZones()
        {
            //Load the TimeZones
            Task<CanaryTimezone> ctzTask = GetTimezoneAsync();
            CanaryTimezone ct = await ctzTask;
            for (int i = 0; i < ct.timeZones.Length; i++)
            {
                ToolStripMenuItem tssmiTimezone = new ToolStripMenuItem();
                tssmiTimezone.Text = ct.timeZones[i];
                tssmiTimezone.Click += new EventHandler(TimezoneChanged);
                tssbTimezone.DropDownItems.Add(tssmiTimezone);
            }
        }
        private async Task<CanaryTimezone> GetTimezoneAsync()
        {
            CanaryTimezone ct = null;

           await Task.Run(() =>
            {
                ct = Program.caAPI.getTimezones();

            });
            return ct;
        }

不知何故,从 GetAggregates 返回的数据被发送回 GetTimezones 的数据。然后 GetTimezones 在 ct.timeZones.length 部分抛出 NullReferenceException。我输出从 Program.caAPI.getTimeZones() 接收到的数据,并在该函数中获取聚合数据。当我不使用 async await 时,我会收到正确的数据。我完全不知道为什么会这样。

1 个答案:

答案 0 :(得分:-1)

GetAggregatesAsyncGetTimezoneAsync 中删除异步。

private CanaryAggregate GetAggregates()
{
    CanaryAggregate ca = Program.caAPI.getAggregates();
    return ca;
}