我需要每 5 秒通过 UDP 向服务器发送某个 LinkStatus 数据包。此外,如果服务器连续超过5次没有响应,则需要通知用户并尝试恢复连接。
我围绕 UdpClient 做了一个包装器,其中有方法:用于连接
public void Connect()
{
_client.Connect(new IPEndPoint(_ipAddress, _port));
StartReceiveAsync();
}
把关掉
public void Disconnect()
{
_client.Dispose();
}
发送包裹:
public async Task SendAsync(IRequest request)
{
await _client.SendAsync(request.Bytes);
}
要在单独的线程中接收包:
private void StartReceiveAsync()
{
var receive = new Task(async () =>
{
try
{
while (true)
{
var receivedResults = await _client.ReceiveAsync();
Notify?.Invoke(receivedResults.Buffer);
}
}
catch
{
Console.WriteLine("Прием сообщений был прерван");
}
}, TaskCreationOptions.LongRunning);
receive.Start();
}
使用此包装器的工作是在单独的服务中进行的。实现向服务发送连接状态请求、检查未收到响应的次数以及终止从服务器接收消息的线程的方法的最佳方法是什么?
创建一个平庸的计数器
发送时
收到后
剩下的就是找到一个地方来执行检查,在发送过程中,通过计时器,或者任何对你来说更方便的方式。
另请阅读:在 C# 中创建无限重复的方法
LongRunning
如果您只有一个任务,那么创建任务就没有意义。使用 simpleTask.Run
而不是 constructorTask
。我什至还要说,这里一般不需要流量。另外,现在我仔细一看,你的
LongRunning
任务只工作了几毫秒,当你进入第一个await
. 因为async
您有一个委托async void
,并且构造函数Task
不接受async Task
(Func<Task>
) 委托,所以根本不存在这样的重载。也就是说,您强制生成一个线程,然后立即将其丢弃。这是没有必要的。之后很容易检查、执行await receive;
或receive.Wait();
输出到控制台,你会看到它会立即工作并完成,并且没有什么可期待的。