Tag: nonblocking

如何使用C#使用Protobuf进行非阻塞套接字读取?

让我们说我想从网络套接字进行非阻塞读取。 我可以异步等待套接字读取x字节,一切都很好。 但是如何通过protobuf将其与反序列化相结合? 从流中读取对象必须阻塞? 也就是说,如果流包含的解析器数据太少,那么必须在后台进行一些阻塞,以便读者可以获取所需的所有字节。 我想我可以使用lengthprefix分隔符并读取第一个字节,然后计算出在解析之前我必须获取最少的字节数,这是正确的方法吗? 例如,如果我的缓冲区是500字节,则等待那500个字节,并解析长度前缀,如果长度超过500,则再次等待,直到读取所有内容。 结合非阻塞IO和protobuf解析的惯用方法是什么? (我现在正在使用Jon Skeet的实现http://code.google.com/p/protobuf-csharp-port/ )

如何在命名管道(c#)上进行非等待写入?

我正在使用.net 3.5命名管道,我的服务器端是: serverPipeStream = new NamedPipeServerStream(“myPipe”, PipeDirection.InOut, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous); 当我用BinaryWriter写一些数据时,write()调用本身不会返回,直到客户端在其NamedPipeClientStream上调用了read()。 BinaryWriter是: writer = new BinaryWriter(serverPipeStream); 我知道NamedPipeServerStream提供了BeginRead / BeginWrite但是从我收集的内容来看,命名管道应该允许streamwriters在它们之上执行(如许多微软给出的例子所示)。 那么如何让我的write()到命名管道不等待? 在此先感谢您的帮助。

C#中的Volatile和Thread.MemoryBarrier

为了实现multithreading应用程序的无锁代码 ,我使用了volatile变量, 理论上 : volatile关键字用于确保所有线程都能看到volatile变量的最新值; 因此,如果线程A更新变量值,并且线程B在更新发生之后读取该变量,它将看到最近从线程A写入的最新值。正如我在Nutshell书中的C#4.0中读到的那样,这是不正确的,因为 应用volatile不会阻止写入后读取交换。 可以通过在每次获取volatile变量之前放置Thread.MemoryBarrier()来解决这个问题: private volatile bool _foo = false; private void A() { //… Thread.MemoryBarrier(); if (_foo) { //do somthing } } private void B() { //… _foo = true; //… } 如果这解决了问题; 考虑我们有一个while循环,它依赖于其中一个条件的值; 在while循环之前放置Thread.MemoryBarrier()是解决问题的正确方法吗? 例: private void A() { Thread.MemoryBarrier(); while (_someOtherConditions && _foo) { // do somthing. } […]

C#中标准I / O的非阻塞读取

我想从控制台获得非阻塞读取function。 我如何用C#编写?