【发布时间】:2023-04-09 22:50:01
【问题描述】:
我一直在处理异步调用,我发现方法的异步版本比同步版本运行得慢得多。任何人都可以评论我可能遗漏的内容。谢谢。
统计
同步方法时间为 00:00:23.5673480
异步方法时间为 00:01:07.1628415
每次调用返回的记录/条目总数 = 19972
下面是我正在运行的代码。
-------- 测试类 ----------
[TestMethod]
public void TestPeoplePerformanceSyncVsAsync()
{
DateTime start;
DateTime end;
start = DateTime.Now;
for (int i = 0; i < 10; i++)
{
using (IPersonRepository repository = kernel.Get<IPersonRepository>())
{
IList<IPerson> people1 = repository.GetPeople();
IList<IPerson> people2 = repository.GetPeople();
}
}
end = DateTime.Now;
var diff = start - end;
Console.WriteLine(diff);
start = DateTime.Now;
for (int i = 0; i < 10; i++)
{
using (IPersonRepository repository = kernel.Get<IPersonRepository>())
{
Task<IList<IPerson>> people1 = GetPeopleAsync();
Task<IList<IPerson>> people2 = GetPeopleAsync();
Task.WaitAll(new Task[] {people1, people2});
}
}
end = DateTime.Now;
diff = start - end;
Console.WriteLine(diff);
}
private async Task<IList<IPerson>> GetPeopleAsync()
{
using (IPersonRepository repository = kernel.Get<IPersonRepository>())
{
return await repository.GetPeopleAsync();
}
}
-------------- 存储库-------- --------
public IList<IPerson> GetPeople()
{
List<IPerson> people = new List<IPerson>();
using (PersonContext context = new PersonContext())
{
people.AddRange(context.People);
}
return people;
}
public async Task<IList<IPerson>> GetPeopleAsync()
{
List<IPerson> people = new List<IPerson>();
using (PersonContext context = new PersonContext())
{
people.AddRange(await context.People.ToListAsync());
}
return people;
}
【问题讨论】:
-
使用异步的目的并不严格是为了提高性能。
-
我不是 c# 专家,但我认为在
GetPeopleAsync方法中都不应使用“await”,因为它会暂停执行并且这些方法实际上不是异步的。唯一的暂停必须是Task.WaitAll。 -
我同意,但结果不应该相差那么远,尤其是在数据不小的情况下。
-
@AlexeiKaigorodov 那不正确。那里的
await完全合适。 -
我同意Servy,我不知道你们怎么了...我发了但我想又是同步错误... Alex的帖子在发帖时出现在我面前...
标签: c# asynchronous task-parallel-library async-await .net-4.5