C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 53 を表示中)
■29443 / )  UDP非同期通信について
□投稿者/ フミ (12回)-(2008/12/09(Tue) 20:24:24)

分類:[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;
    }

返信 編集キー/


管理者用

- Child Tree -