百科问答小站 logo
百科问答小站 font logo



golang select 模式 在C#中如何实现? 第1页

  

user avatar   Ivony 网友的相关建议: 
      

没完全看懂……猜一下,你这个不就是TakeFromAny+超时么?


C#的异步很多,async只是其中一个语法糖而已,还有很多基础部件,譬如说RX、TPL……dotnet core后来又加了标准的Channel实现


==========================================================


其实要完全对标go的行为应该用Channel,这货完全对标go的channel。

其实.NET提供了最全面的异步和并行模式,大部分你能想到的方案都在.NET里面可以找到对应的解决方案。


最简单的方法,单执行绪调度器,事实上如果你只有一个执行绪,那锁是不需要的,简单说就是轮询各个队列看哪个队列有数据就立即处理完事。这个不需要锁(因为没有并发),要等待直接用Sleep或者Delay都可以。

比较难看一点的方案就是多个队列并发然后控制一下同一时间只有一条消息能被处理就行,最简单的直接用lock锁住再处理消息,通常来说这需要一个支持ack机制的消息队列避免消息丢失,但是通常来说只要进程不崩就不会丢消息也没啥。

复杂一点儿的方案就是改主动为被动,不是主动拉取数据而是等数据到的时候进行处理。这个vczh说的Rx当然是个方案,但是代码太复杂了,直接用DataFlow的ActionBlock就完了。

非要和Go比较贴合的方案就是BlockingCollection,但是这货的问题是不支持异步阻塞。所以原理上和你自己搞个单执行绪调度器是一回事儿,内部实现也差不多。

完全贴合Go的方案就是直接用Channel<T>,这货完全对标Go的channel。

虽然select没有直接的语法支持,但实际上也没什么难的,开一堆Task异步阻塞WaitToReadAsync就可以,这个方法是当Channel有消息的时候立即返回,否则异步阻塞。等这个方法返回后再去争抢一下,异步争抢阻塞可以直接用SemaphoreSlim……




  

相关话题

  C# 和 Java 哪个更像 C++? 
  C#泛型(MSIL)的内部是怎么实现的? 
  c#表达式目录树的作用是什么?利与弊是什么?应用场景有哪些? 
  Build 2018 开发者大会上发布的 .NET Core 3.0 规划蓝图透露了哪些信息? 
  为什么 2010 年前后诞生的语言(如 Golang, Rust, Swift)都是强类型 + 静态? 
  为什么一个简单的闭包,C#要设计得如此巨大? 
  C# 写的程序如何测试效率, 知道哪快代码有问题? 
  【C#】this 关键字限定本地类型的成员? 
  使用 Unix Domain Socket 连接 MySQL,查询速度和使用 127.0.0.1 连接差不多,使用 Go 测试,为什么? 
  C#下有什么办法可以实现毫秒级的计划任务? 

前一个讨论
假如将日志记录通过网闸单向导入隔离存储服务器,能提高黑客消除篡改日志痕迹的难度吗?
下一个讨论
如何看待男子为了打一副银手镯,连偷 40 个奔驰车标,但奔驰车标只是不锈钢?





© 2024-11-16 - tinynew.org. All Rights Reserved.
© 2024-11-16 - tinynew.org. 保留所有权利