注意,虽然冲突非常罕见,但任务标识符并不一定是唯一的。
这是否意味着堆中可以同时存在具有相同ID的任务?或者它是否意味着它不可能存在,但是有一些具有其他任务已经不存在的it的任务?
发布于 2022-03-15 01:26:54
这意味着,如果创建4,294,967,295个任务,并读取每个任务的Id
属性,那么第一个任务和最后一个任务的值都将为Id
。
您可以看到Task.Id
属性这里的源代码。以下是此代码的实质:
public class Task
{
private volatile int m_taskId;
public int Id
{
get
{
if (m_taskId == 0)
{
int newId = NewId();
Interlocked.CompareExchange(ref m_taskId, newId, 0);
}
return m_taskId;
}
}
internal static int s_taskIdCounter;
internal static int NewId()
{
int newId = 0;
do
{
newId = Interlocked.Increment(ref s_taskIdCounter);
}
while (newId == 0);
return newId;
}
}
https://stackoverflow.com/questions/71475947
复制相似问题