【发布时间】:2012-07-17 09:24:37
【问题描述】:
我需要的是一个按顺序执行异步操作的类。
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...*/ };
}
如果我按Send、Receive和Send的顺序调用,我需要先发送,并将剩余的接收和发送操作排队,直到第一个接收完成。
我尝试在课堂上创建一个主要任务字段并遵循MainTask = MainTask.ContinueWith(...) 类型的方法。我什至写了一个名为 Sequencer 的类,它正是这样做的,但不知何故感觉不对,在延续和其他东西中创建嵌套任务(使用 Task.Factory.FromAsync 方法)。
我还尝试做一些事情,比如排队 TaskCompletionSource 对象并在我的 Receive/Send 方法中返回它们的任务,在一个单独的线程上以无限循环检查队列,但由于我将有大约 200k 的 FooSocket 实例,一个线程用于各自也觉得不明智。如果我把它做成一个线程池,我会得出这个“线程池不应该用于长时间运行的操作”的规则。
我感觉很接近,但不确定订购这些工作的最有效方式是什么。
【问题讨论】:
-
如果您可以使用 C#5 或异步扩展,甚至更好的 F#,如果不是,那么您应该使用 Task.FromAsync/Task.ContinueWith 方式,恕我直言
-
您想同步运行异步操作吗?
-
@Carsten,我需要在 C# 4 中完成。
-
@Jodrell,有点;当涉及到它们自己的操作时,所有 FooSocket 实例都应该同步工作,而从调用者的角度来看是异步的。
-
@d4wn:或多或少是微不足道的——你基本上只需要添加一些 async/await 关键字——你可以在这里找到很多示例和信息:msdn.microsoft.com/en-us/vstudio/async.aspx
标签: c# sockets asynchronous task-parallel-library asyncsocket