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