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
是有益的,因为该操作还有一个同步部分,因此在后台线程上执行,而不是阻塞原始线程。例如,在将字符串异步写入磁盘之前,可能需要将其序列化为字节数组。序列化是同步完成的,并且可能受益于在后台线程上运行