非阻塞io使用BinaryWriter写入usblp0

本文关键字:BinaryWriter 写入 usblp0 使用 io | 更新日期: 2023-09-27 18:08:32

我正在用c# (mono)做一个程序来打印到财政打印机(escpos),它工作正常。问题是,当我打印时,程序会挂起,直到我的缓冲区被清空。所以,你可以想象如果我打印一些图像它会变大,所以它会挂一段时间。这是不可取的。我用两种方法进行了测试

:

BinaryWriter outBuffer;
this.outBuffer = new BinaryWriter(new  FileStream (this.portName,System.IO.FileMode.Open));
.... apend bytes to buffer...
IAsyncResult asyncResult = null; 
asyncResult = outBuffer.BaseStream.BeginWrite(buffer,offset,count,null,null);
asyncResult.AsyncWaitHandle.WaitOne(100);
outBuffer.BaseStream.EndWrite(asyncResult); // Last step to the 'write'.
if (!asyncResult.IsCompleted) // Make sure the write really completed.
{
throw new IOException("Writte to printer failed.");             
}

第二种方式:

BinaryWriter outBuffer;
this.outBuffer = new BinaryWriter(new  FileStream (this.portName,System.IO.FileMode.Open));
.... apend bytes to buffer...
outBuffer.Write(buffer, 0, buffer.Length);

,两个方法都不允许程序继续执行。例如:如果它开始打印,而纸用完了,它会挂起,直到打印机恢复打印,这是不正确的方式。

提前感谢您的时间和耐心。

非阻塞io使用BinaryWriter写入usblp0

问题是您让程序等待写操作完成。如果您希望它异步发生,那么您需要提供一个回调方法,该方法将在写入完成时调用。例如:

asyncResult = outBuffer.BaseStream.BeginWrite(buffer,offset,count,WriteCallback,outBuffer);
private void WriteCallback(IAsyncResult ar)
{
    var buff = (BinaryWriter)ar.AsyncState;
    // following will throw an exception if there was an error
    var bytesWritten = buff.BaseStream.EndWrite(ar);
    // do whatever you need to do to notify the program that the write completed.
}

这是一种方法。你应该阅读异步编程模型的其他选项,并选择一个最适合你的需求。

您也可以使用任务并行库,这可能是一个更好的选择。