使用任务作为字典键?

Use Task as dictionary key?

可以使用 Task 作为字典键还是一个坏主意?有什么可能因此而出现的问题吗?

任务没有自己的 GetHashCode,而是直接从 Object 派生的引用类型。结果 GetHashCode/Equals 不会根据对象的状态而变化,仅取决于对象的引用 (GetHashCode)。

因此 Task 可以用作字典的键,并允许从任务到数据进行快速查找。比赛将在确切的对象上进行。

常见用法 - 通过运行它们的代码将一些数据与 运行 任务相关联,即日志 ID:

 Task task1 = Task.Delay(100);
 Task[] allTasks = new[]{task1}; 

 var dictionary = new Dictionary<Task, string> { {task1, "first-task"}};

 Task completed = await Task.WhenAny(allTasks);
 Console.WriteLine($"Task {dictionary[completed]} finished");