【发布时间】:2016-08-16 20:55:22
【问题描述】:
我有一个方法,由我的 UI 线程触发,可以加载一些数据。 UI 线程不会立即需要数据。大部分数据来自数据库,部分数据是从文件中读取的。使数据库异步读取后,文件读取变慢了。
这就是我原来的加载方法的样子:
public void load() {
var sw = new Stopwatch();
sw.Start();
db1.loadDB();
sw.Stop();
Console.WriteLine("DB1: " + sw.Elapse.Milliseconds);
sw.Restart();
db2.loadDB();
sw.Stop();
Console.WriteLine("DB2: " + sw.Elapse.Milliseconds);
sw.Restart();
db3.loadDB();
sw.Stop();
Console.WriteLine("DB3: " + sw.Elapse.Milliseconds);
sw.Restart();
file.loadFile();
sw.Stop();
Console.WriteLine("File: " + sw.Elapse.Milliseconds);
}
因为每个数据库 loadDB 方法都执行多个数据库查询,所以我认为异步实现它们可能是个好主意。
public void load() {
var sw = new Stopwatch();
sw.Start();
taskDB1 = db1.loadDBAsync();
sw.Stop();
Console.WriteLine("DB1: " + sw.Elapse.Milliseconds);
sw.Restart();
taskDB2 = db2.loadDBAsync();
sw.Stop();
Console.WriteLine("DB2: " + sw.Elapse.Milliseconds);
sw.Restart();
taskDB3 = db3.loadDBAsync();
sw.Stop();
Console.WriteLine("DB3: " + sw.Elapse.Milliseconds);
sw.Restart();
file.loadFile();
sw.Stop();
Console.WriteLine("File: " + sw.Elapse.Milliseconds);
}
任务在另一个方法中等待,当 UI 线程实际需要数据时调用。
困扰我的是 loadFile 方法执行所花费的时间。在 loadDB 的异步实现之前,它们每个都需要大约 100 毫秒才能完成,而 loadFile 方法大约需要 20 毫秒才能完成。 loadDBAsync 的异步实现大约需要 5ms 才能完成。但在第二个示例中,loadFile 方法需要 50 毫秒才能完成。我根本没有更改 loadFile 方法。
怎么可能,异步数据库访问会减慢读取文件的速度?
编辑: 添加了我用来测量时间的代码。 数据库在同一个磁盘上,至少现在是这样。 5ms是提交任务。
【问题讨论】:
-
如果你的数据库和文件在同一个磁盘上。你可能会遇到 IO 瓶颈。你确定你的 loadDBAsync 只用了 5 毫秒,还是提交任务用了 5 毫秒。跨度>
-
首先:您是如何衡量这些时间的?这已经是分析的重要部分。第二:请注意,您的 CPU 仍然必须完成所有相同的工作,并且 IO 工作也仍然相同。使数据库调用异步时的不同之处只是发生这种情况的时刻。因此,您需要考虑什么时候才能获得最佳性能。
-
请向我们展示您用于执行测量计算的代码。
标签: c# asynchronous