Task中建一个Queue 出了sleep等方法。如何等待队列中填充任务并且执行后返回?

boyyao 2021-05-02 10:00:50
假设我有有个要求延迟极低的数据要处理。比如var r = MD5(str) 需要用最快的方式得到MD5的结果。

按照低级的方法。我在Task中用如下方式来实现。

while (true)
{
if (!string.IsNullOrWhiteSpace(str))
{
strr= MD5(str)
str= null;
}
Thread.Sleep(1);
}
但是首先这个方法感觉很不美观。并且查询得知。sleep在系统上的最低精度是15ms。并且返回的数据也相对麻烦。要么做事件。要么也要类似while去等待读取。。

想用Queue 尝试实现类似功能。。不知道Queue能否相对美观,快速的等待数据被填充。并且方便快速的返回处理后的数据?
或者请教有没有其他比较合适的方法?


...全文
679 12 打赏 收藏 举报
写回复
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanghui0380 2021-05-06
这样把,上面说了可以利用驱动和外置硬件 主要是驱动通过各种中断运行,不抢调度。通过南桥dma方式读写内存,不抢io。 外置硬件独立芯片不抢cpu 所以呢,你非要如此可以用opencl这类gpu计算库,让显卡去算。毕竟一般服务器显卡就是摆设,任务不重。我们可以利用利用(外置计算棒也行),毕竟你连15ms都要纠结,那我们直接建议用外设和中断,绕过系统调度了
  • 打赏
  • 举报
回复
一直跑也不是说他就快啊,又不是即时操作系统
  • 打赏
  • 举报
回复
删库到跑路 2021-05-06
引用 10 楼 大葡萄八块一斤 的回复:
一直跑也不是说他就快啊,又不是即时操作系统
你的大西瓜不见了?
  • 打赏
  • 举报
回复
ziqi0716 2021-05-06
你倒不如先单线程同步的先实现了你的基本功能,再考虑下哪里能优化,能改成异步,能改成多线程等等。 死循环这种代码,有坏味道在里面。
  • 打赏
  • 举报
回复
Eason0807 2021-05-04
另外你可以使用Task.ContinueWith(t=>{}) MD5的Task完成后执行运行下一个需要MD5的任务,这应该时最快的方式了 但是运行MD5的Task是不是立即执行也不能控制,你只能提高他的优先级
  • 打赏
  • 举报
回复
Eason0807 2021-05-04
你还不如自己启动一个后台线程做了,对于需要长期持有的线程来说不适合Task
  • 打赏
  • 举报
回复
橘子皮zzz 2021-05-04
应该在MD5后直接挂任务不是么
  • 打赏
  • 举报
回复
xuzuning 2021-05-02
你的意思是 Task 中有一个循环在等待外部数据的改变?这显然是错误的
  • 打赏
  • 举报
回复
boyyao 2021-05-02
这里的sleep是为了等待str变量的变化。。str变量变化了才去做下一步动作。 意思是。一个Task需要一直在执行。然后其他task有计算md5需求时。让这个Task来完成。。
  • 打赏
  • 举报
回复
xuzuning 2021-05-02
为什么是 sleep? 既然在追求高速度,那要 sleep 做什么?
  • 打赏
  • 举报
回复
wanghui0380 2021-05-02
所以我建议你停止这种无意义的折腾。 前后几个帖子2月都过去了,没有意义。 该说的我们都说了,只最后劝一句。window不是单任务系统,他就只能在“就绪线程”里轮着执行,这是你逃不开的,你要不承认这个,非要搞所谓0等待线程,注定是个徒劳工作 非要如此我觉着你可以放弃c#,你可以使用C++和wdk做个驱动,why,因为驱动程序走内核,走中断。 驱动程序在可以做到你所谓的0等待,并且可以把计算外置
  • 打赏
  • 举报
回复
boyyao 2021-05-02
我知道这种做法不对。。但是我不知道有什么其他方法可以代替这种方式呢? 首先task不能少。例子看上去可以省去这个task。但是实际上task不能少。。这个task的作用就是快速的吧md5结果返回给调用者。
  • 打赏
  • 举报
回复
相关推荐
发帖
C#

10.8w+

社区成员

.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
帖子事件
创建了帖子
2021-05-02 10:00
社区公告

让您成为最强悍的C#开发者