根据Task https://source.dot.net/#System.Private.CoreLib/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs,1483的源代码

因此Task在内部使用ManualResetEventSlim内核同步 struct

internal ManualResetEventSlim CompletedEvent
{
    get
    {
        ContingentProperties contingentProps = EnsureContingentPropertiesInitialized();
        if (contingentProps.m_completionEvent == null)
        {
            bool wasCompleted = IsCompleted;
            ManualResetEventSlim newMre = new ManualResetEventSlim(wasCompleted);  // <----------------
            if (Interlocked.CompareExchange(ref contingentProps.m_completionEvent, newMre, null) != null)
            {
                // Someone else already set the value, so we will just close the event right away.
                newMre.Dispose();
            }
            else if (!wasCompleted && IsCompleted)
            {
                // We published the event as unset, but the task has subsequently completed.
                // Set the event's state properly so that callers don't deadlock.
                ContingentProperties.SetEvent(newMre);
            }
        }

        return contingentProps.m_completionEvent;
    }
}

但是,运行任务难道不意味着线程池将"工作项"(在高级中表示为任务)放到全局/本地队列中,然后它将被工作线程拾取来运行吗?是否需要使用任何内核线程同步构造?我的意思是它与谁同步?这里使用内核构造的目的是什么?

推荐答案

是否需要使用任何内核线程同步构造?

是的,对于Wait的方法.当您调用Wait时,您希望阻塞当前线程,直到Task在另一个线程上完成.ManualResetEventSlim执行阻塞当前线程的角色,直到来自完成线程的信号,使得当前线程可以被解锁.

运行Task难道不意味着线程池将"工作项"(在高级中表示为任务)放到全局/本地队列中,然后它将被工作线程拾取来运行吗?

这就是在2010年.NET Framework4.0中引入的delegate-based tasks.下一个.NET版本(2012年的.NET Framework4.5)引入了async/await技术,这使得Promise风格的任务更加突出.这些任务可以代表任何内容,而不仅仅是完成委托.今天的大多数任务都属于第二类.例如,File.ReadAllTextAsync返回promise 样式的Task.在这次行动的大部分时间里,有no thread架与TaskBundle 在一起.

Csharp相关问答推荐

CsWin32如何创建PWSTR的实例,例如GetWindowText

如何使用CsvReader获取给定列索引的列标题?

在C#WinUI中,一个关于System的崩溃."由于未知原因导致执行不例外"

使用Audit.EntityFramework,我如何将外键的值设置为相关实体上的属性?

从Blob存储中提取tar.gz文件并将提取结果上载到另一个Blob存储

需要在重新启动ApplicartionPool或IIS后启动/唤醒API的帮助

Blazor在FluentButton onClick事件上设置参数

WinForms在Linux上的JetBrains Rider中的应用

如何将此方法参数化并使其更灵活?

在.NET MAUI.NET 8中如何防止按钮点击时出现灰色反馈

将类移动到新命名空间后更新RavenDB Raven-Clr-Type

如何在CSharp中将json字符串转换为DataTable?

关于扩展文件类C#的矛盾

.NET8->;并发词典总是比普通词典快...怎么回事?[包含基准结果和代码]

JsonPath在Newtonsoft.Json';S实现中的赋值

匿名类型的AbstractValidator

发布.NET 8 Blazor WebAssembly独立应用程序以进行静态站点部署

c#在后台实现类型化数组

SignalR跨域

在Swagger中显示自定义属性的属性名称