2

私はc#を学んでいますが、コードがReceivePacket領域のDataGridViewに行を追加しない理由を知りたいです。SendPacketで機能しますが、他では機能しません。目的は、事前のおかげで、UDPパケットをマシンに送信することです。これが私のコードです:

private void btnSend_Click(object sender, EventArgs e)
        {
            SendPacket();
        }
        private void btnReceiving_Click(object sender, EventArgs e)
        {
            Thread thread = new Thread(new ThreadStart(reciev));
            thread.Start();
        }    

UdpClient client = new UdpClient();

        public void SendPacket()
        {
            byte[] packet = Encoding.ASCII.GetBytes(DateTime.Now.ToString("HH:mm:ss:ff"));
            client.Send(packet, packet.Length, tbIP.Text, 444);
            dgvSend.Rows.Add(DateTime.Now.ToString("HH:mm:ss:ff"));
        }

        public void ReceivePacket(byte[] packet)
        {// it goes wrong here, because it gives a crossthread error
            dgvReceiv.Rows.Add(Encoding.ASCII.GetString(packet), DateTime.Now.ToString("HH:mm:ss:ff"));
        }

        public void reciev()
        {
            UdpClient client = new UdpClient(444);
            while (true)
            {
                IPEndPoint server = new IPEndPoint(IPAddress.Any, 0);
                byte[] packet = client.Receive(ref server);
                ReceivePacket(packet);
            }
        }

通常のコードの代わりにこのコード行を使用して修正しました(invoke :)):

dgvReceiv.Invoke(new MethodInvoker(delegate { dgvReceiv.Rows.Add(Encoding.ASCII.GetString(packet), DateTime.Now.ToString("HH:mm:ss:ff")); }));
4

2 に答える 2

2

ここでは、デリゲートを使用して、メインスレッドで作成されたコントロールで他のスレッドからアクションを呼び出す例を示します。

http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx

于 2012-09-21T07:46:19.040 に答える
1

問題は、メインGUIスレッドとは別のスレッドでGUI要素(フォーム)を作成しようとしていることです。GUI要素はGUIスレッドでのみ作成できます。それ以外は機能しません。

セカンダリスレッドでデータを受信し、それをGUIスレッドにコピーして、GUI要素内に配置する必要があります。コントロールが作成されたスレッドで関数を呼び出すデリゲートである関数があると思いますControl.Invoke。これを使用して、セカンダリスレッドから呼び出して、フォームやその他のコントロールに実際にデータを入力できます。

于 2012-09-21T07:43:51.507 に答える