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将始终实际同步执行该方法?
我有一个 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 请求中被调用。
这是否意味着所有的过滤器(包括IAuthorizationFilter,IActionFilter,IResourceFilter,IExceptionFilter等)在ASP.NET MVC的核心是单身,这意味着他们将ASP.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) 在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)
结果: …