0

フォームの右側にある「X」をクリックしてアプリケーションを閉じようとすると、問題が発生します。次のエラーが表示されます。

スレッドが存在するか、アプリケーション要求が原因で、I/O 操作が中止されました

そして、私はこのコード行を取得しています:

newsocket.EndReceiveFrom(ar,ref tmp);

これが私のコードの例です:

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        int m;
        Socket newsocket;    
        EndPoint tmp;
        IPEndPoint sen = new IPEndPoint(IPAddress.Loopback, 5001);
        byte[] data = new byte[1024];
        byte[] buffer = new byte[1024];

        public Form1()
        { 
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e) 
        {
            CheckForIllegalCrossThreadCalls = false;
            IPEndPoint endpoint = new IPEndPoint(IPAddress.Loopback, 1235);
            newsocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,ProtocolType.Udp);
            newsocket.Bind(endpoint);
            tmp = (EndPoint)sen;
            newsocket.BeginReceiveFrom(data, 0, 40, SocketFlags.None,ref tmp, new AsyncCallback(ReadCallback), tmp);
            Thread thread = new Thread(new ThreadStart(this.threadtask));
            thread.Start();
        }

        protected void ReadCallback(IAsyncResult ar) 
        {
            newsocket.EndReceiveFrom(ar,ref tmp);
            send();
            newsocket.BeginReceiveFrom(data, 0, 40, SocketFlags.None, ref tmp, new AsyncCallback(ReadCallback), tmp);
        }

        private void send()
        {
            newsocket.BeginSendTo(buffer, 0, 7, SocketFlags.None, sen, newAsyncCallback(SendCallback), sen);
        }

        protected void SendCallback(IAsyncResult ar)
        {
            newsocket.EndSendTo(ar);
        }

        private void threadtask()
        {
            while (true)
            {
                cMicroLCCore.getDAC(m).Value = data[m];
            }
        }
    }
}
4

1 に答える 1

1

君の

Thread thread = new Thread(new ThreadStart(this.threadtask));
thread.Start();

レシーバー スレッドはバックグラウンドで実行されています。フォームのアンロードとレシーバー スレッドの正常な終了を処理するコードは見当たりません。それがあなたがする必要があることです-フォームを閉じるときにスレッドを停止します(クラス変数にスレッド参照を保存する必要があります)。

于 2012-08-17T08:32:43.833 に答える