C# 运行多个返回相同结果的任务时出现问题

C# 运行多个返回相同结果的任务时出现问题,c#,async-await,C#,Async Await,我有下面的代码(简化为可读)。我的问题是,只要返回类型是值类型(bool/int)并且具有相同的值,列表中的任务就完全相同。如果结果是引用类型(例如:bool?),或者如果返回不同的int值,则任务不再相等 我不明白为什么任务是相等的,即使它们实际上工作正常(控制台记录所有6个值),请有人解释一下或给我指一些文档来解释这一点 [TestMethod] public async Task RunMultipleTasks() { var list = new Lis

我有下面的代码(简化为可读)。我的问题是,只要返回类型是值类型(bool/int)并且具有相同的值,列表中的任务就完全相同。如果结果是引用类型(例如:bool?),或者如果返回不同的int值,则任务不再相等

我不明白为什么任务是相等的,即使它们实际上工作正常(控制台记录所有6个值),请有人解释一下或给我指一些文档来解释这一点

[TestMethod]
    public async Task RunMultipleTasks()
    {
        var list = new List<int> {0, 1, 2, 3, 4, 5};
        var tasks = list.Select(i => RunSimple(i)).ToList();
        var x = await Task.WhenAll(tasks);
        Assert.IsTrue(tasks[0]== tasks[1]);  
    }

    private async Task<bool> RunSimple(int i)
        {
            Console.WriteLine(i);
            return true;
        }
[TestMethod]
公共异步任务RunMultipleTasks()
{
var list=新列表{0,1,2,3,4,5};
var tasks=list.Select(i=>RunSimple(i)).ToList();
var x=等待任务。WhenAll(任务);
Assert.IsTrue(任务[0]==tasks[1]);
}
专用异步任务RunSimple(int i)
{
控制台写入线(i);
返回true;
}

我还注意到,如果在RunSimple方法中添加延迟,或者删除异步和返回任务,则任务不再相同。FromResult(true)

这是因为RunSimple同步运行并返回常量值。我认为编译器用一个预先计算的任务来代替它。
P.S.任务。FromResult(true)每次都使用TaskCompletionSource创建新任务。

这是因为RunSimple同步运行并返回常量值。我认为编译器用一个预先计算的任务来代替它。


P.S.任务。FromResult(true)每次都使用TaskCompletionSource创建新任务。

这些任务被缓存用于常见用例


编译器在使用
async
关键字时生成的状态机使用
AsyncTaskMethodBuilder
结构。对于常见的用例,例如,对于数字返回
0
,对于布尔返回
true
false
,出于性能原因,它使用缓存任务。可在中找到其代码



这将更详细地描述该行为。

任务将缓存以用于常见用例


编译器在使用
async
关键字时生成的状态机使用
AsyncTaskMethodBuilder
结构。对于常见的用例,例如,对于数字返回
0
,对于布尔返回
true
false
,出于性能原因,它使用缓存任务。可在中找到其代码


这将更详细地描述行为。

您应该使用:

await Task.Run(() => Console.WriteLine(i));
而不是:

Console.WriteLine(i);
在RunSimple()方法中。

您应该使用:

await Task.Run(() => Console.WriteLine(i));
而不是:

Console.WriteLine(i);

使用RunSimple()方法。

非常感谢!非常感谢你!旁注:
bool?
不是引用类型。@PauloMorgado你是对的旁注:
bool?
不是引用类型。@PauloMorgado你是对的