-1

次のコードを使用して、イーサネット ポートから読み取っています。

System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();

class ClsReadPort
    {

    public void Connect()
        {
            try
            {
                clientSocket = new System.Net.Sockets.TcpClient();
                if (!clientSocket.Connected)
                {
                    clientSocket.Connect("192.168.0.25", 1324);
                }
              }
            catch (Exception ex)
            {
               MsgBox(ex.Message)

            }
        }

        public string Capture()
        {
            try
            {
                if (clientSocket.Connected)
                {
                   NetworkStream serverStream = clientSocket.GetStream();
                        byte[] inStream = new byte[clientSocket.ReceiveBufferSize + 1];
                        serverStream.Read(inStream, 0, Convert.ToInt32(clientSocket.ReceiveBufferSize));
                        string returndata = System.Text.Encoding.ASCII.GetString(inStream);

                        oCapture = returndata;
                 }
              }

            }
            catch (Exception ex)
            {
             MsgBox(ex.Message)
            }
        }
}

読み取り値を更新するための私のメインプログラムでは:

ClsReadPort objRead = new ClsReadPort();

private void timer1_Tick(object sender, EventArgs e)
{
txtReadValue.Value = objRead.Capture();
}

正常に動作しています。しかし、イーサネット ケーブルが切断されるたびに、UI 全体がハングアップします。この行にとどまります:

serverStream.Read(inStream, 0, Convert.ToInt32(clientSocket.ReceiveBufferSize));

UIに影響を与えずに並列タスクとして行うには??

4

2 に答える 2

1

.net 4.5では、非同期メソッドを使用してそれらを待つことができます。非同期については、こちらをご覧ください

これは、 MSDNからの待機なしの非同期ソケットサンプルでもあります

于 2013-03-28T07:05:53.657 に答える
0

Dispatcher を使用して、Capture タスクを別のスレッドで開始できます

Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() =>
{  
    try
    {       
        txtReadValue.Value = objRead.Capture();   
    }
    catch { } 
}
于 2013-03-28T07:17:27.837 に答える