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能否相对美观,快速的等待数据被填充。并且方便快速的返回处理后的数据?
或者请教有没有其他比较合适的方法?


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

8.5w+

社区成员

64.0w+

社区内容

.NET技术 C#
社区公告
暂无公告