3

c# (mono) で会計プリンター (escpos) に印刷するプログラムを実行していますが、問題なく動作します。問題は、印刷すると、バッファがクリアされるまでプログラムがハングすることです。ご想像のとおり、画像をいくつか印刷するとサイズが大きくなり、しばらくハングします。これは望ましくありません。私は2つの方法でテストしました

片道

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);

どちらの方法でも、プログラムが実行を継続することはできません。例: 印刷を開始して用紙がなくなった場合、プリンターが印刷を再開するまで停止しますが、これは正しい方法ではありません。

どうぞよろしくお願いいたします。

4

1 に答える 1

1

問題は、書き込みが完了するまでプログラムを待機させていることです。非同期で実行する場合は、書き込みが完了したときに呼び出されるコールバック メソッドを提供する必要があります。例えば:

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.
}

それはそれを行う1つの方法です。他のオプションについては非同期プログラミング モデルを参照し、ニーズに最も適したものを選択してください。

Task Parallel Libraryを使用することもできます。これは、より適している可能性があります。

于 2013-04-11T23:15:59.880 に答える