当前位置: 首页 > 知识库问答 >
问题:

是否可以在C#中创建自己的非阻塞异步任务

狄玮
2023-03-14

C#中的许多内置IO函数是非阻塞的,也就是说,它们在等待操作完成时不会抓住线程不放。

例如,返回任务 system.io.file.ReadAllLinesAsync是非阻塞的。

它不只是暂停它正在使用的线程,它实际上释放了线程,以便其他进程可以使用它。

我假设这是通过调用OS来实现的,这样OS在检索到文件时就回调到程序,而程序不必浪费一个线程来等待它。

是否可以自己创建一个非阻塞的异步任务?

执行类似thread.sleep()的操作显然不会像system.io.file.ReadAllLinesAsync那样释放当前线程。

我意识到Hibernate线程并不占用CPU资源,但它仍然占用线程,这在处理大量请求的web服务器中可能是一个问题。

我说的不是一般情况下如何生成任务。我说的是用于处理文件/网络调用的内置C#函数在线程等待时如何释放线程。

共有1个答案

益英逸
2023-03-14

System.Threading.Tasks命名空间中的Task类应该提供您要查找的功能。您可以使用它创建task对象来运行您试图实现的任何进程。例如,如果有一个方法int longrunner需要很长时间执行,并且希望异步访问它,则可以定义task longrunnerasync :

public Task<int> LongRunnerAsync() {
    return Task.Run( () => LongRunner() );
}

定义自定义任务有几种方法:

  • 使用task.run(...)方法定义任务。这是定义任务的默认方法,因为它编写起来很简单,并且可以立即启动任务。您可以通过调用以下命令来执行此操作:
Task.Run( () => {
    doWork();
}
  • 定义任务以使用构造函数运行预定义操作。这允许您定义一个不立即启动的任务。这可以通过以下方式完成:
Action action = () => doWork();
Task task = new Task(action);
task.Start();
  • 使用Task.Factory.StartNew(...)方法定义任务。此方法允许比task.run(...)更多的自定义,但提供了类似的功能。只有在有特定原因需要任务时,我才建议使用此方法。run(...)

请参阅Microsoft的文档页。

 类似资料:
  • 我认为下面的流量链将通过事件循环放置/执行(像JS)。因此,运行下面的代码将首先打印阻塞循环&然后将执行通量链。 但是,整个通量总是先执行,然后才移动到循环。[我确实有一些语句正在阻塞。但是有两个阶段] 当我们使用reactor时,通过使用一些调度程序来实现异步/非阻塞行为的唯一方法? 如果我不使用任何调度器,并让代码使用当前线程执行,那么即使对于IO密集型应用程序,使用WebFlux而不是Spr

  • 问题内容: 我想使用redis的pubsub传输一些消息,但不想使用阻止,例如以下代码: 最后一部分将被阻止。我只想检查给定频道中是否有数据,该如何完成?有没有类似的方法? 问题答案: 我认为那不可能。通道没有任何“当前数据”,您订阅了一个通道并开始接收该通道上其他客户端推送的消息,因此它是一个阻塞的API。另外,如果您查看pub / sub 的Redis Commands文档,将会更加清楚。

  • 本文向大家介绍请你说一下阻塞,非阻塞,同步,异步相关面试题,主要包含被问及请你说一下阻塞,非阻塞,同步,异步时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 阻塞和非阻塞:调用者在事件没有发生的时候,一直在等待事件发生,不能去处理别的任务这是阻塞。调用者在事件没有发生的时候,可以去处理别的任务这是非阻塞。 同步和异步:调用者必须循环自去查看事件有没有发生,这种情况是同步。调用者不用自己去查看

  • 本文向大家介绍java 中同步、异步、阻塞和非阻塞区别详解,包括了java 中同步、异步、阻塞和非阻塞区别详解的使用技巧和注意事项,需要的朋友参考一下 java 中同步、异步、阻塞和非阻塞区别详解 简单点说: 阻塞就是干不完不准回来,一直处于等待中,直到事情处理完成才返回; 非阻塞就是你先干,我先看看有其他事没有,一发现事情被卡住,马上报告领导。 我们拿最常用的send和recv两个函数来说吧..

  • 实时的web特性通常需要为每个用户一个大部分时间都处于空闲的长连接. 在传统的同步web服务器中,这意味着需要给每个用户分配一个专用的线程,这样的开销是十分巨大的. 为了减小对于并发连接需要的开销,Tornado使用了一种单线程事件循环的方式. 这意味着所有应用程序代码都应该是异步和非阻塞的,因为在同一时刻只有一个操作是有效的. 异步和非阻塞这两个属于联系十分紧密而且通常交换使用,但是它们并不完全

  • 问题内容: 但是,我在C#中对此进行了测试: 结果是: 1 5 因此,它似乎是,相反的答案,线程开始读取和结束读线程是 不 一样的。 因此,现在我的问题是,如何在.NET中实现 单线程 ,基于事件的无阻塞异步Web服务器? 问题答案: 整个过程是一条红鲱鱼,这只是一种编组机制,工作仍在IO线程池中进行。 您需要的是一种从主线程对所有IO工作进行排队和收集异步过程调用的方法。许多更高级别的框架都包装