Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按顺序运行异步套接字操作_C#_Sockets_Asynchronous_Task Parallel Library_Asyncsocket - Fatal编程技术网

C# 按顺序运行异步套接字操作

C# 按顺序运行异步套接字操作,c#,sockets,asynchronous,task-parallel-library,asyncsocket,C#,Sockets,Asynchronous,Task Parallel Library,Asyncsocket,我需要的是一个按顺序执行异步操作的类 class FooSocket { private Socket _Socket; // Message is a class that wraps a byte array. public Task<Message> Receive() { /*Bla...*/ }; public Task<int> Send(Message message) { /*Bla...*/ }; } class-Fo

我需要的是一个按顺序执行异步操作的类

class FooSocket
{
    private Socket _Socket;

    // Message is a class that wraps a byte array.
    public Task<Message> Receive() { /*Bla...*/ };
    public Task<int> Send(Message message) { /*Bla...*/ };
}
class-FooSocket
{
专用插座(u插座),;
//Message是一个包装字节数组的类。
公共任务接收(){/*Bla…*/};
公共任务发送(消息消息){/*Bla…*/};
}
如果按此顺序调用Send、Receive和Send,则需要先发送,并将剩余的接收和发送操作排队,直到第一次接收完成

我尝试在类中创建一个主任务字段,并采用一种
MainTask=MainTask.ContinueWith(…)
方法。我甚至编写了一个名为Sequencer的类,它确实做到了这一点,但不知怎么的,它感觉错了,在continuations之类的东西中创建了嵌套任务(使用Task.Factory.fromsync方法)

我还尝试了一些东西,比如将TaskCompletionSource对象排队,并在我的接收/发送方法中返回它们的任务,在一个单独的线程上以无限循环的方式检查队列,但是由于我将有大约200k的FooSocket实例,因此每个实例都有一个线程也感觉不明智。如果我将其设为线程池,我会得出“线程池不应用于长时间运行的操作”规则


我感觉很接近,但无法确定订购这些作业的最有效方式。

如果是请求/响应类型的行为,那么任务粒度应该是完整的往返,而不是将发送和接收分开

您不需要CTP for.NET4支持,您可以使用异步目标包


消费代码是什么样子的?带有等待调用的循环?

如果是请求/响应类型的行为,那么任务粒度应该是完整的往返,而不是分离发送和接收

您不需要CTP for.NET4支持,您可以使用异步目标包

消费代码是什么样子的?带有等待呼叫的循环?

我会使用。您可以安装它,也可以将其作为。TPL数据流提供了一种基本的
BufferBlock
类型,听起来正是您所需要的

如果您只是对一个套接字进行建模,那么当数据被缓冲出去时,完成
发送
任务,连续读取到另一个缓冲区,然后在从该缓冲区读取时完成
接收
任务。(注意:
套接字上的“发送”操作在数据缓冲到操作系统时完成,而不是在数据通过线路或到达目的地时)

如果您要对更高级别的命令/响应进行建模,那么您应该有一个代表整个命令/响应的任务,正如James所建议的那样。我两者都会做;使用
async
/
await
支持,可以轻松地将一个分层到另一个分层。(注意:
套接字上的“接收”操作可能会完成部分接收,因此您需要)

您的体系结构可能还需要一些工作:

我将有大约20万个FooSocket实例

这肯定是个问题(我假设您使用的是TCP/IP)。只有约65K个TCP/IP端口,默认情况下只有约16K个是短暂的,您必须为操作系统留出大量的“喘息空间”,否则操作系统就会出现异常。我估计只有约12K的连接是现实的,除非你改变短暂的范围,这可能(理论上)使你达到约59K~200K是不可能的-除非您更改临时范围并使用负载平衡器拥有多个IP地址。

我会使用。您可以安装它,也可以将其作为。TPL数据流提供了一种基本的
BufferBlock
类型,听起来正是您所需要的

如果您只是对一个套接字进行建模,那么当数据被缓冲出去时,完成
发送
任务,连续读取到另一个缓冲区,然后在从该缓冲区读取时完成
接收
任务。(注意:
套接字上的“发送”操作在数据缓冲到操作系统时完成,而不是在数据通过线路或到达目的地时)

如果您要对更高级别的命令/响应进行建模,那么您应该有一个代表整个命令/响应的任务,正如James所建议的那样。我两者都会做;使用
async
/
await
支持,可以轻松地将一个分层到另一个分层。(注意:
套接字上的“接收”操作可能会完成部分接收,因此您需要)

您的体系结构可能还需要一些工作:

我将有大约20万个FooSocket实例


这肯定是个问题(我假设您使用的是TCP/IP)。只有约65K个TCP/IP端口,默认情况下只有约16K个是短暂的,您必须为操作系统留出大量的“喘息空间”,否则操作系统就会出现异常。我估计只有约12K的连接是现实的,除非你改变短暂的范围,这可能(理论上)使你达到约59K~200K是不可能的-除非你改变短暂的范围,并使用负载平衡器拥有多个IP地址。

如果你可以使用C#5或异步扩展或更好的F#如果不这样做很容易,那么你应该去任务。fromsync/Task.ContinueWith你想同步运行异步操作吗?@Carsten,“我需要用C#4来做,”约德雷尔,有点;当涉及到自己的操作时,所有FooSocket实例都应该同步工作,同时在调用者的透视图中充当异步的角色。@d4wn:或多或少都很简单-您基本上只需要添加一些async/await关键字-您可以在这里找到lot的示例和信息:如果您可以使用C#5或异步扩展或更好的F#,那么就很容易了如果没有,那么你应该选择Task.fromsync/Task.continuew以同步运行异步操作的方式?@Carsten,我需要用C#4来完成它。@Jodrell,有点;所有FooSocket实例在其自己的操作中都应该同步工作,同时在调用方的透视图中充当异步角色。@d4wn:或多或少都很简单-基本上只需添加一些async/await关键字即可