views:

505

answers:

5

Are there any non-blocking IO frameworks for .NET?

I am looking for something similar to what Apache Mina and JBoss Netty provides for Java: a framework for implementing highly scalable servers - not just the low-level support that the .NET framework provides.

EDIT: To better explain what I would like to see, here is a basic example of what you can do with Mina:

In Mina I can implement a ProtocolDecoder like this:

public class SimpleDecoder extends CumulativeProtocolDecoder {
  protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception {
    if (in.remaining() < 4) 
      return false;
    int length = in.getInt();
    if(in.remaining() < 4 + length)
      return false;
    Command command = new Command(in.asInputStream());
    out.write(command);
  }
}

And a CommandHandler like this:

public abstract class CommandHandler extends IoHandlerAdapter{
  public void messageReceived(IoSession session, Object message) throws IOException, CloneNotSupportedException {
    Command command = (Command) message;
    // Handle command. Probably by putting it in a workqueue.
  }
}

If I start the server by calling

CommandHandler handler = new CommandHandler();
NioSocketAcceptor acceptor = new NioSocketAcceptor();
acceptor.getFilterChain().addLast("protocol", new ProtocolCodecFilter(new SimpleDecoder(false)));
acceptor.setLocalAddress(new InetSocketAddress(port));
acceptor.setHandler(handler);
acceptor.bind();

I will get a non-blocking server.

It will run a single (or at least just a few) threads, cycling through all incoming connections, gathering data from the sockets, and call SimpleDecoder.doDecode() to see if it has a complete command on the connection. Then it will pass the command to CommandHandler.messageReceived(), and I can take over the processing.

+2  A: 

Non-blocking I/O has been part of .NET since day 1. What are you looking for,exactly?

John Saunders
I am looking for a server-framework on top of the low-level calls in .NET.
Rasmus Faber
I don't know enough about Java to know why something like MINA would be helpful. But async access is built into every level of .NET. It's in WCF, ADO.NET, Workflow - everywhere. I looked at the MINA page and see no value in .NET for anything they said on that page.
John Saunders
Maybe you could give us some idea of the kind of program you need to write. Don't assume that something like MINA is required to do that.
John Saunders
+4  A: 

I'd take a look at the Windows Communication Foundation. It has many options that allow usage patterns similar to your samples.

Reed Copsey
A: 

Are you looking for ASP.NET's support for asynchronous pages? Allowing an async-operation to complete while allowing the original processing thread to process other HTTP requests and then picking up the original request when the async-operation completes?

Richard
A: 

You can use Mina directly in .Net via ikvm.

Todd Stout
A: 

You can take a look at SuperSocket, http://supersocket.codeplex.com/ It may not be strong like Mina and Netty, but it is kind of simple framework you can use easily.

Kerry Jiang