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