使用异步调用时,我遇到了严重的SQL性能问题.我创建了一个小案例来证明这个问题.
我在SQL Server 2016上创建了一个数据库,它驻留在我们的LAN中(因此不是localDB).
在该数据库中,我有一个WorkingCopy包含2列的表:
Id (nvarchar(255, PK))
Value (nvarchar(max))
Run Code Online (Sandbox Code Playgroud)
DDL
CREATE TABLE [dbo].[Workingcopy]
(
[Id] [nvarchar](255) NOT NULL,
[Value] [nvarchar](max) NULL,
CONSTRAINT [PK_Workingcopy]
PRIMARY KEY CLUSTERED ([Id] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
在该表中,我插入了一条记录(id='PerfUnitTest',Value是一个1.5mb的字符串(一个较大的JSON数据集的zip)).
现在,如果我在SSMS中执行查询:
SELECT [Value]
FROM [Workingcopy]
WHERE id = 'perfunittest'
Run Code Online (Sandbox Code Playgroud)
我立即得到结果,我在SQL Servre Profiler中看到执行时间大约是20毫秒.一切正常.
使用plain从.NET(4.6)代码执行查询时SqlConnection:
// at this point, the connection …Run Code Online (Sandbox Code Playgroud) 这是我的代码。读取文件行的 WPF 按钮的事件处理程序:
private async void Button_OnClick(object sender, RoutedEventArgs e)
{
Button.Content = "Loading...";
var lines = await File.ReadAllLinesAsync(@"D:\temp.txt"); //Why blocking UI Thread???
Button.Content = "Show"; //Reset Button text
}
Run Code Online (Sandbox Code Playgroud)
我File.ReadAllLines()在 .NET Core 3.1 WPF App 中使用了异步版本的方法。
但它阻塞了 UI 线程!为什么?
更新:与@Theodor Zoulias 相同,我做了一个测试:
private async void Button_OnClick(object sender, RoutedEventArgs e)
{
Button.Content = "Loading...";
TextBox.Text = "";
var stopwatch = Stopwatch.StartNew();
var task = File.ReadAllLinesAsync(@"D:\temp.txt"); //Problem
var duration1 = stopwatch.ElapsedMilliseconds;
var isCompleted = task.IsCompleted;
stopwatch.Restart();
var lines …Run Code Online (Sandbox Code Playgroud)