C# 为什么使用Task.runon异步函数不';t返回任务<;任务<;T>&燃气轮机;

C# 为什么使用Task.runon异步函数不';t返回任务<;任务<;T>&燃气轮机;,c#,.net,asynchronous,task-parallel-library,return-type,C#,.net,Asynchronous,Task Parallel Library,Return Type,考虑以下代码段,其中以不同方式调用了MyMethod及其异步版本MyMethodAsync: using System; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { static int MyMethod() { System.Threading.Thread.Sleep(1000);

考虑以下代码段,其中以不同方式调用了
MyMethod
及其异步版本
MyMethodAsync

using System;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static int MyMethod()
        {
            System.Threading.Thread.Sleep(1000);

            return 42;
        }

        static async Task<int> MyMethodAsync()
        {
            await Task.Delay(1000);

            return 42;
        }

        static void Main(string[] args)
        {
            var result1 = MyMethod(); // int
            var result2 = MyMethodAsync(); // Task<int>
            var result3 = Task.Run(() => MyMethod()); // Task<int>
            var result4 = Task.Run(() => MyMethodAsync()); // Task<int>
        }
    }
}
使用系统;
使用System.Threading.Tasks;
命名空间控制台应用程序1
{
班级计划
{
静态int-MyMethod()
{
系统线程线程睡眠(1000);
返回42;
}
静态异步任务MyMethodAsync()
{
等待任务。延迟(1000);
返回42;
}
静态void Main(字符串[]参数)
{
var result1=MyMethod();//int
var result2=MyMethodAsync();//任务
var result3=Task.Run(()=>MyMethod());//Task
var result4=Task.Run(()=>MyMethodAsync());//Task
}
}
}
在每种情况下,我都对返回类型进行了注释

问题是为什么
result4
的类型也是
Task
?这不是任务吗


顺便说一句,通过
Task.Run
调用异步方法是否有益?

它返回
Task
的原因是调用重载,重载返回的任务充当函数返回的任务的代理。如果要使用原始重载,可以指定泛型类型参数:

var result3 = Task.Run(() => MyMethod()); // Task<int>
var result4 = Task.Run(() => MyMethodAsync()); // Task<int>
var result5 = Task.Run<Task<int>>(() => MyMethodAsync()); // Task<Task<int>>
var result3=Task.Run(()=>MyMethod());//任务
var result4=Task.Run(()=>MyMethodAsync());//任务
var result5=Task.Run(()=>MyMethodAsync());//任务
至于第二个问题:在异步操作上使用
Task.Run
是有益的,因为该操作还有一个同步部分,因此在后台线程上执行,而不是阻塞原始线程。例如,在将字符串异步写入磁盘之前,可能需要将其序列化为字节数组。序列化是同步完成的,并且可能受益于在后台线程上运行