C# 异步等待返回的数据问题

C# 异步等待返回的数据问题,c#,C#,所以我对C#async和wait有一个问题。我有两个长时间运行的函数,我想在Windows窗体应用程序上异步onLoad调用它们。我将它们封装在2个异步函数中。一个获取时区,另一个获取聚合。问题在于数据之间存在某种冲突。这些是功能: private async void LoadAggregates() { //Load Available Aggregates Task<CanaryAggregate> caTask

所以我对C#async和wait有一个问题。我有两个长时间运行的函数,我想在Windows窗体应用程序上异步onLoad调用它们。我将它们封装在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;
        }
private async void LoadAggregates()
{
//装载可用骨料
Task caTask=GetAggregatesAsync();
金丝雀骨料ca=等待卡塔斯克;
字典Aggs=ca.aggregates;
foreach(Aggs/*PropertyDescriptor中的KeyValuePair项,TypeDescriptor.GetProperties(ca.aggregates)*/)
{
cbAggregate.Items.Add(item.Key);
}
cbAggregate.SelectedIndex=cbAggregate.FindStringExact(Properties.Settings.Default.Aggregate);
}
专用异步任务GetAggregatesAsync()
{
金丝雀ca=null;
等待任务。运行(()=>
{
ca=Program.caAPI.getAggregates();
});
返回ca;
}
专用异步void LoadTimeZones()
{
//加载时区
任务ctzTask=GetTimezoneAsync();
加那利时区ct=等待ctzTask;
对于(int i=0;i
{
ct=Program.caAPI.getTimezones();
});
返回ct;
}

以某种方式,从GetAggregates返回的数据被发送回GetTimezones的数据。然后GetTimezones在ct.timeZones.length部分抛出NullReferenceException。我输出从程序.caAPI.getTimeZones()接收的数据,并在该函数中获取聚合数据。当我不使用async Wait时,我收到的是正确的数据。我完全不知道为什么会发生这种情况。

GetAggregatesAsync
GetTimezoneAsync
中删除异步

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

“不知何故,从GetAggregates返回的数据被发送回GetTimezones的数据。”-我不相信你。无论如何,您的代码似乎没有显示足够的信息。我们看不到这些方法是如何被调用的。另外,如果
getTimeZones()
getAggregates()
是网络/IO绑定的方法,为什么它们不是异步的?您能告诉我们如何使用这些方法吗?我认为问题应该存在,因为这些方法之间似乎没有共享任何数据。除非是针对事件处理程序,否则不要执行
async void
。在所有其他情况下,使用
异步任务