相关疑难解决方法(0)

使用SqlCommand Async方法时性能很差

使用异步调用时,我遇到了严重的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)

.net c# sql-server asynchronous async-await

89
推荐指数
1
解决办法
8869
查看次数

Thread.Sleep vs Task.Delay?

我知道Thread.Sleep阻止线程.

Task.Delay也阻止?或者它就像是Timer使用一个线程进行所有回调(当不重叠时)?

(这个问题不包括差异)

c# multithreading .net-4.0 .net-4.5

54
推荐指数
1
解决办法
2万
查看次数

为什么 File.ReadAllLinesAsync() 会阻塞 UI 线程?

这是我的代码。读取文件行的​​ 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)

c# wpf asynchronous async-await .net-core-3.1

4
推荐指数
1
解决办法
620
查看次数