所以我遇到了 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 时,我会收到正确的数据。我完全不知道为什么会这样。
答案 0 :(得分:-1)
从 GetAggregatesAsync
和 GetTimezoneAsync
中删除异步。
private CanaryAggregate GetAggregates()
{
CanaryAggregate ca = Program.caAPI.getAggregates();
return ca;
}