小编Sco*_*.Hu的帖子

await Task.CompletedTask 是否意味着异步方法将同步运行?

static async Task WaitTaskCompleted()
{
    //Use Thread A before await Task.CompletedTask
    await Task.CompletedTask;
    //Will the code after await Task.CompletedTask always use Thread A, or there is chance to have a Thread B?
}
Run Code Online (Sandbox Code Playgroud)

这意味着await Task.CompletedTask将始终实际同步执行该方法?

c# task async-await

5
推荐指数
1
解决办法
2814
查看次数

ASP.NET Core MVC 过滤器是单例吗?

我有一个 AuthorizationFilter 如下:

public class AuthorizationFilterAttribute : Attribute, IAuthorizationFilter
{
    public AuthorizationFilterAttribute()
    {
        //Constructor of AuthorizationFilter will be called one time
    }

    public void OnAuthorization(AuthorizationFilterContext context)
    {
        //OnAuthorization method will be called per http request
    }
}
Run Code Online (Sandbox Code Playgroud)

我发现 AuthorizationFilter 的构造函数在整个 ASP.NET Core 应用程序生命周期中只会被调用一次。但是它的 OnAuthorization 方法将在每个 HTTP 请求中被调用。

这是否意味着所有的过滤器(包括IAuthorizationFilterIActionFilterIResourceFilterIExceptionFilter等)在ASP.NET MVC的核心是单身,这意味着他们将ASP.NET的核心应用生命周期过程中创建只是一个时间?

c# asp.net-core

5
推荐指数
2
解决办法
792
查看次数

.NET 是否在新的不同线程池线程上恢复等待继续,还是重用先前恢复的线程?

.NET 是否在新的不同线程池线程上恢复等待继续,还是重用先前恢复的线程?

让我们在下面的 .NET Core 控制台应用程序中的 C# 代码中想象一下:

using System;
using System.Threading;
using System.Threading.Tasks;

namespace NetCoreResume
{
    class Program
    {
        static async Task AsyncThree()
        {
            await Task.Run(() =>
            {
                Console.WriteLine($"AsyncThree Task.Run thread id:{Thread.CurrentThread.ManagedThreadId.ToString()}");
            });

            Console.WriteLine($"AsyncThree continuation thread id:{Thread.CurrentThread.ManagedThreadId.ToString()}");
        }

        static async Task AsyncTwo()
        {
            await AsyncThree();

            Console.WriteLine($"AsyncTwo continuation thread id:{Thread.CurrentThread.ManagedThreadId.ToString()}");
        }

        static async Task AsyncOne()
        {
            await AsyncTwo();

            Console.WriteLine($"AsyncOne continuation thread id:{Thread.CurrentThread.ManagedThreadId.ToString()}");
        }

        static void Main(string[] args)
        {
            AsyncOne().Wait();

            Console.WriteLine("Press any key to end...");
            Console.ReadKey();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它会输出:

AsyncThree …
Run Code Online (Sandbox Code Playgroud)

c# multithreading asynchronous async-await

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

为什么在 SQL Server 中乘以 DECIMAL 时会出现精度损失?

在SQL Server中运行此脚本(我的版本是SQL Server 2016):

DECLARE @num1 DECIMAL(20,7)
DECLARE @num2 DECIMAL(20,7)
SET @num1 = 0.0000005
SET @num2 = 1.0
SELECT @num1 * @num2 AS Result
Run Code Online (Sandbox Code Playgroud)

结果:

Result
---------------------------------------
0.00000050000
Run Code Online (Sandbox Code Playgroud)

结果的规模为 0.00000050000DECIMAL(X,11)

现在,如果我们将脚本更改如下:

DECLARE @num1 DECIMAL(21,7)
DECLARE @num2 DECIMAL(20,7)
SET @num1 = 0.0000005
SET @num2 = 1.0
SELECT @num1 * @num2 AS Result
Run Code Online (Sandbox Code Playgroud)

结果:

Result
---------------------------------------
0.0000005000
Run Code Online (Sandbox Code Playgroud)

你可以看到结果是0.0000005000,看起来比例缩小了DECIMAL(X,10)

继续提高@num1的精度:

DECLARE @num1 DECIMAL(22,7)
DECLARE @num2 DECIMAL(20,7)
SET @num1 = 0.0000005
SET @num2 = 1.0
SELECT @num1 * @num2 AS Result
Run Code Online (Sandbox Code Playgroud)

结果: …

sql t-sql sql-server

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