Я пытаюсь прочитать с удаленного сервера, используя TcpClient
, и я хочу, чтобы это асинхронно.
Я создал стандартный Forms.Timer
, который тикает каждую секунду и вызывает функцию с опросами с сервера.
Я могу читать с сервера, то есть мне удается увидеть значения внутри моего buffer
но по какой-то причине я получаю (я предполагаю, что через 5 секунд после Delay)
эта операция не разрешена для неподключенных сокетов
это мое соединение с функцией сервера
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);
}