小编Mat*_*olf的帖子

ZeroMQ,客户端< - >服务器,只有让客户端连接到主机才能实现双向通信?

我面临以下问题:

我有一个客户端(最终是n-clients)并且喜欢连接到服务器.客户端知道服务器/主机地址,但服务器不知道客户端的地址.我希望能够在客户端 - 服务器之间完成以下消息传递模式(客户端和服务器都需要能够完成以下消息模式):

  • 发布消息(无需回复)
  • 接收消息(无预期回复)
  • 请求/接收消息(预期回复)
  • 流消息(这可能是多余的,因为它可能通过上面的发布消息模式提供)

同样重要的一点,我奋斗的地方是如何连接到主机,同时仍然能够发送和接收消息.主机无法连接到客户端,它只能接受客户端连接请求.请注意,我不寻找与客户端和服务器连接的代理/代理的解决方案,否则我可以直接使用rabbitmq等解决方案.

我怎样才能最好地完成这一点,参考代码示例甚至更好.

非常感谢.

c# messaging client publish-subscribe zeromq

9
推荐指数
1
解决办法
4427
查看次数

实现异步套接字客户端的当前实践标准是什么?

我寻找满足以下要求的最佳实践:

  • 以异步方式处理多个客户端套接字的框架
  • 每个传入消息协议都规定每条消息都是格式字符串,并标有换行符'\n'.
  • 我完全控制客户端,但不是服务器端.服务器接受并发送带有换行符的基于字符串的消息,以标记消息的完成.
  • 我希望能够在任何给定时间通过每个连接的套接字发送消息(每个套接字可以接收和发送消息).
  • 应通过回调转发传入消息.
  • 我希望能够在我的实现中选择是否所有连接套接字的所有传入完整消息都路由到一个回调,或者每个套接字客户端是否实现自己的回调.
  • 我连接最多4个客户端/套接字.因此,我寻找利用这些有限数量的套接字的建议,但是,能够同时管理所有这些套接字.

我想知道我使用的框架BeginReceiveEndReceive实现的IAsyncResult回调是否是最先进的,因为我的目标是.Net 4.5.有没有更好的解决方案,例如使用NetworkStream或其他API选择?使用BeginReceive/EndReceive实现真正让我感到困惑的是,在EndReceive之后,我必须再次调用BeginReceive并再次注册回调.这对我来说听起来像是一个可怕的开销.为什么不能将新数据异步在任何时候,在同一时间增加了另一个环境中建立被然后通过引发的事件路由的完整信息?

使用IAsyncResult的论点通常是在处理线程处理时给出的,但是反对以下内容:使用NetworkStream并简单地读取和写入流.如上所述,只交换字符串消息,每个协议的每条消息都由换行符标记完成.单独的任务/线程将轮询流式读取器(基于网络流)ReadLine().它可能不会比那更简单,可以吗?

我基本上要问的是,以下代码如何才能真正实现异步?

public class SocketClient
{
    private TcpClient client;
    private StreamReader reader;
    private StreamWriter writer;

    public event Action<string> MessageCallback;

    public SocketClient(string hostname, int port)
    {
        client = new TcpClient(hostname, port);

        try
        {
            Stream stream = client.GetStream();
            reader = new StreamReader(stream);
            writer = new StreamWriter(stream);
            writer.AutoFlush = true;

            //Start Listener on port
            StartListener();
        }
        catch (Exception e)
        {
            throw new Exception(e.ToString());
        }
    }

    public void …
Run Code Online (Sandbox Code Playgroud)

c# sockets asynchronous tcp networkstream

8
推荐指数
1
解决办法
5136
查看次数

Roslyn,如何在运行时在脚本中实例化一个类并调用该类的方法?

我理解如何在C#中使用Roslyn执行整个脚本,但我现在想要完成的是在脚本中编译一个类,实例化它,将其解析为接口,然后调用已编译和实例化的类实现的方法.

Roslyn是否公开了这样的功能?你能指点我这样的方法吗?

谢谢

c# runtime-compilation roslyn

8
推荐指数
1
解决办法
1727
查看次数

如何确定一个类是在控制台应用程序或wpf中实例化的?

我需要编写一个围绕第三方api的包装器,它会使用消息泵,因此根据是否在UI线程(例如在wpf应用程序中)实例化包装器(例如控制台应用程序),需要对其进行非常不同的处理).

如果它不在UI线程上运行,那么我需要一个调度程序并实现我自己的消息泵.

为此,我需要知道包装器是否在wpf应用程序中实例化.仅确定实例化是否发生在UI线程上是不够的(即使在wpf应用程序中,实例化包装器的线程可能不是UI线程).

有什么办法我可以弄清楚我是在一个带有消息泵或控制台应用程序的wpf或windows窗体环境中我必须实现自己的消息泵吗?

谢谢

c# wpf dispatcher ui-thread

8
推荐指数
2
解决办法
590
查看次数

RabbitMQ的传输速度加快了吗?

我寻找如何通过RabbitMQ加速消息传输的想法.

我在Windows 64位上安装了最新版本,在本地计算机上运行服务器,我也通过C#实现发布和使用该服务器.我最初以每秒40,000条消息的速度增加,这令人印象深刻但不符合我的需求(我与一个自定义二进制阅读器竞争,每秒可以处理2400万个未解析的16字节大字节数组;显然我不希望接近这个但是我试图改善至少).我需要尽快发送大约115,000,000条消息.我不想保留数据,并且连接将直接针对单个消费者.然后,我构建了16b字节数组的块,并在没有任何改进的情况下发布到总线上.传输速率最高可达45mb /秒.我发现这非常慢,因为最终它应该归结为原始传输速度,因为我可以创建大小为几兆字节的字节数组,其中交换机的路由效率与原始传输速度相比可以忽略不计.为什么我的消息总线最大传输速度为45mb /秒?

c# erlang producer-consumer rabbitmq

7
推荐指数
1
解决办法
1270
查看次数

单机上低延迟,高吞吐量数据传输的最佳并发框架

我正在寻找使用C#如何为我的特定架构实现并发框架的想法:

我实现了几个模块/容器(实现为类),它们都是单独连接到消息总线的.每个模块主要产生或主要消耗,但所有模块还实现用于两个给定模块之间的通信的请求/应答模式.我对并发和异步编程非常陌生,但本质上希望以并发方式而不是同步方式运行整个架构.鉴于以下要求,我真的很感激为我的特定用例考虑哪些技术(TPL,ThreadPool,CTP,开源库,......)的指针:

  • 整个系统只能在本地机器上运行(进程内,甚至是消息总线)
  • 至少有一个模块执行大量IO(每秒从物理驱动器读取数百万个16byte消息),在整个时间内将多个16字节块发布到阻塞集合.
  • 另一个模块在整个时间内从阻塞集合中消耗.
  • 入口点是生产者开始发布消息,当生产者完成发布有限的16byte消息集时退出.
  • 绕过消息总线的唯一通信是出于吞吐量和延迟原因而向阻塞集合发布/消费.(很高兴听到建议摆脱消息总线,如果它是合理的)
  • 其他模块处理诸如写入SQL数据库,发布到GUI服务器,连接到与外部服务器通信的API等操作.这些操作运行频率较低/受限制,可能作为任务运行,而不是在运行整个线程时使用整个线程.系统.
  • 我使用的是64位四核16GB内存机器,但理想情况下我想实现一个也可以在双核心机器上运行的解决方案.

鉴于我喜欢管理你建议我应该关注的并发实现?

编辑:我想强调,我面临的最大问题是如何方便地将每个容器/模块连接到线程/任务池,以便每个模块都运行异步,同时仍然提供这些模块之间的完全进出通信.在我没有解决将所有模块连接到可以处理动态涉及的任务/线程数量的并发平台之前,我并不太关心优化单个生产者/消费者模式.

c# concurrency multithreading asynchronous task-parallel-library

7
推荐指数
1
解决办法
4391
查看次数

Parallel.ForEach同时保留订单

我有一个List<byte[]>,我喜欢将每个反序列byte[]化为Foo.列表是有序的,我喜欢写一个并行循环,其中结果List<Foo>包含所有Foo的顺序与原始顺序相同byte[].该列表非常大,可以使并行操作变得有价值.有没有内置的方法来实现这一目标?

如果没有,任何想法如何实现同步运行这一切的加速?

谢谢

c# collections parallel-processing concurrency asynchronous

7
推荐指数
1
解决办法
5417
查看次数

通用类型传递和使用,我可以执行以下操作吗?

我试着弄清楚如何在CallMe<T>()类中访问静态方法DoSomething.反思是唯一的解决方案吗?我不想实例化一个类型的对象MyAction.另外,如果通过反射进行,有一种方法可以通过方法内的反射创建方法CallMe<T>()一次,然后多次调用它来对同一个"反射"方法执行多个操作?或者有没有比通过反思更好的方式?我基本上想要创建模板实现样式类,例如MyAction定义如何byte[] DoThis(string text)执行其职责.然后,AskForSomething()将指定正在使用的模板,并根据该模板CallMe<T>()继续其工作.

    public class AskSomething
    {
        public void AskForSomething()
        {
            DoSomething doSomething = new DoSomething();
            doSomething.CallMe<MyAction>();
        }
    }

    public class DoSomething
    {
        public void CallMe<T>()
        {
            Type type = typeof(T);

            //Question: How can I access 'DoThis(string text)' here?
            //Most likely by reflection? 
        }
    }

    public class MyAction
    {
        public static byte[] DoThis(string text)
        {
            byte[] ret = new byte[0]; //mock just to denote …
Run Code Online (Sandbox Code Playgroud)

c# generics reflection interface

7
推荐指数
1
解决办法
125
查看次数

JsonDateHandler枚举在ServiceStack版本4.0.5.0(当前的Nuget版本)中去了哪里?

JsonDateHandler在当前的Nuget ServiceStack版本4.0.5.0中找不到枚举.

有什么指针吗?

servicestack servicestack-text

7
推荐指数
1
解决办法
994
查看次数

安装了包含Python 3.6但缺少pip3的Anaconda 4.3.1(64位),无法安装tensorflow

我从Continuum网站上下载了最新的稳定的Anaconda安装,结果是Anaconda 4.3.1(64位)和Python 3.6.0.我在Windows 10环境中.

但是缺少pip3,我无法通过pip3安装任何Python 3.x软件包.

我究竟做错了什么?

python windows pip anaconda

7
推荐指数
1
解决办法
2万
查看次数