从TcpClient执行异步连续读取

时间:2019-05-14 10:45:19

标签: c# winforms async-await tcpclient streamreader

我正在尝试使用TcpClient从远程服务器进行读取,因此我想做到这一点。 我创建了一个标准的Forms.Timer,它每秒滴答一次,并从服务器中调用带有轮询的函数。

我能够从服务器读取信息,即,我确实设法查看了buffer中的值

但是由于某种原因,我得到了(我猜想是从Delay)起5秒后

  

在未连接的插座上不允许执行此操作

这是我与服务器功能的连接

        public static async Task<string> readFromPLC()
        {

            using (var client = new System.Net.Sockets.TcpClient())
            {               
                Task connectTask =  client.ConnectAsync(ipAddress, port);
                Task timeoutTask = Task.Delay(millisecondsDelay: 5000);

                if (await Task.WhenAny(connectTask, timeoutTask) == timeoutTask)
                {
                  //  throw new TimeoutException("could not connect to the PLC");
                }

                using (var reader = new System.IO.StreamReader(client.GetStream()))
                {                   
                    char[] buffer = new char[1024];
                    while ((await reader.ReadAsync(buffer, 0, buffer.Length)) > 0)
                    {
                        sb.Append(String.Join("", buffer));
                    }
                    return sb.ToString();
                }
            }
        }

这是我的计时器功能

        private async void readFromPLCTimer_Tick(object sender, EventArgs e)
        {
            string res = String.Empty;
            bool plcStatus = false;
            try
            {
                res = await PLCHelper.readFromPLC();
                plcStatus = true;
            }
            catch (Exception ex)
            {
                res = ex.Message;
            }
            setPLCstatus(plcStatus);
            latestCommandTxtBox.AddLine(res);
        }

0 个答案:

没有答案