| 分類:[C#]
毎度お世話になります。 フミと申します。
C#にてUDPによる非同期通信を行っています。 通信をやめるためにUdpClientを閉じたところ、 コールバック内で例外が発生してしまい困っています。
ウィンドウズのフォームにボタンが2つあり、 ボタン1を押すとUDPの受信待ち(udpclient.BeginReceive)、 ボタン2を押すとUDPのソケットをクローズ(udpclient.Close)します。
受信はうまくいくのですが、 受信が終わって、ボタン2を押しクローズしようとすると、 非同期受信のコールバック内でエラーが発生します。
エラー内容は
「破棄されたオブジェクトにアクセスできません。 オブジェクト名 'System.Net.Sockets.UdpClient' です。」
と表示されます。
コールバックで使うのに先にクローズでUdpClientが破棄されてしまうためだと思われるのですが、 何かプログラムに誤りあるいは対処法ありますでしょうか??
以下、用いたプログラムです。
//WindowsForm public partial class Form1 : Form { //UDP Client UdpStateClass usc;
//受信データ byte[] receiveData;
//コンストラクタ public Form1() { InitializeComponent(); }
//ボタン1クリック イベント private void button1_Click(object sender, EventArgs e) { //UDPStateクラスのインスタンス usc = new UdpStateClass();
//エンドポイントとUDPクライアントを入れます usc.endPnt = new IPEndPoint(IPAddress.Any, 44444); usc.udpClt = new UdpClient(44444);
//UDPの非同期受信開始 コールバックはreceiveCallback usc.udpClt.BeginReceive(new AsyncCallback(receiveCallback), usc); }
//ボタン2クリック イベント private void button2_Click(object sender, EventArgs e) { //ソケットを閉じる usc.udpClt.Close(); }
//コールバック public void receiveCallback(IAsyncResult ar) { //IAsysncResultからUDPClientとIPEndPointを受け取る UdpClient uc = ((UdpStateClass)(ar.AsyncState)).udpClt; IPEndPoint iep = ((UdpStateClass)(ar.AsyncState)).endPnt;
//受信データを配列に格納 receiveData = uc.EndReceive(ar, ref iep); /* ↑ボタン2を押しcloseすると上の行でエラー発生 * 「破棄されたオブジェクトにアクセスできません。 * オブジェクト名 'System.Net.Sockets.UdpClient' です。」 */ } }
//UDPStateクラス public class UdpStateClass { public IPEndPoint endPnt; public UdpClient udpClt; } |