私は、SerialPort
クラスを使用していくつかのデバイスと通信するC#でアプリケーションを書いています。私が今直面してきた大きな問題は、すでに使用されているシリアルポートを使用しようとするとすぐに例外が発生するため、リソースを適切に解放する方法です。通常、GCは、私は他に何しようとするアイデアをちょっとだ仕事のほとんどの世話をする必要があるためシリアルポートを正しく解放する
...
は主に私が仕事を行う必要があります(私のロジックで)その2つのことを試してみました。私はセッションベースの通信を使用しているので、私はすべての通信の前後にOpenPort
とClosePort
メソッドを呼び出します - したがって、ポートは閉じなければなりません。また、ポートを含むオブジェクトを後でnullに設定しようとしましたが、まだUnauthorizedAccessExceptions
を取得していますが、SerialPort.Close()
メソッドが呼び出されたことを100%確信しています。
ポートを解放する方法がわかりましたので、私はその例外を取り止めますか?
EDIT:
: 答えてくれてありがとうしかし、廃棄()のものが動作していないが - ので、ここで私のコードがどのように見えるかの例ですけれども、多分、私が何か間違ったことをやっている - 私は前にいることをしようとしました
だからこれは私のラッパークラス次のようになります:
class clsRS232 : IDisposable
{
public void clsRS232()
{
Serialport port = new Serialport("COM1",9600,Parity.none,8,Stopbits.one);
}
public void openPort()
{
port.Open();
}
public void sendfunc(string str)
{
port.Write(str);
}
public string readfunc()
{
port.ReadTo("\n");
}
public void Dispose()
{
port.Dispose();
}
}
今、私はRS232通信を必要とする時はいつでも、私はCALのどちらかが、動作しません - それは私がちょうどIDisposable
を追加したものの、Øyvindが提案かなり似実際ですこのようなラ新しいインスタンス:
clsRS232 test = new clsRS232;
test.openport();
test.sendfunc("test");
test.Dispose();
しかし、それは何も変更しません - 私はまだUnauthorizedAccessExceptionsの多くを得る - と他の男が(右だった場合SERIALPORTクラスの処分は、()のみSerialPort.Closeが含まれていること( )) - それでは、私は関数呼び出しclose()を持っていた以前のアプローチから何も変更していないと思います。あなたの答えのための
ありがとう - まだ解決策を見つけることを望ん:)
速い答えに感謝するが、私は本当にそれをすることができない。私はシリアルポート通信に使用する独自のクラスで多くの独自のメソッドをラップしています - 彼らはすべて、クラスが最初に呼び出されたときに初期化される1つのポートを使用します。このようにしたい場合は、ポートを使用するすべてのメソッドにこのようなブロックを記述する必要があります。 – Lorenz
クラスを作成したときからポートを開いたままにし、すべての操作が完了したときにポートを閉じるか、各操作の前後にポートへの接続を開いたり閉じたりしますか? –
最初の1つ - 私のラッパークラスは、そのコンストラクタを介してSerialPortのインスタンスを開始します - これは、複数のメソッドを使って/ recieveなどで使用できますが、一度自分自身のclose()関数(一度はSerialPort.Close ())私は、Serialportを完全に自由に再インスタンス化したいと思っています。私が何かを書いた後にポートを閉じて、何かを受け取るために再び開くと、バッファが消えてしまいます。 – Lorenz