C# - 具有特定持续时间的 TcpClient 异步连接



我正在尝试创建一个函数,该函数尝试在特定时间内异步连接到主机,然后检查是否已建立连接。

我的问题是我无法为此异步连接添加持续时间。

我的职能:

 public async Task<bool> IsConnected()
 {
        // Host IP Address and communication port
        string ipAddress = "192.168.0.11";
        int port = 9100;
        //Try to Connect with the host during 2 second
        {
            // Create TcpClient and try to connect
            using (TcpClient client = new TcpClient())
            { 
                Task<bool> mytask = client.ConnectAsync(ipAddress, port).Wait(TimeSpan.FromSeconds(2));
                bool isconnected = await mytask;
                if (isconnected)
                {
                    //Connection with host
                    return true;
                }
                else
                {
                    // No connection with host
                    return false;
                }
                //Close Connection
                client.Close();
            }
        }
        catch (Exception exception)
        {
            // Problem with connection
            return false;
        }
}

我有这个错误:

Cannot implicitly convert type 'bool' to 'System.Threading.Tasks.Task<bool>' at line :
Task<bool> mytask = client.ConnectAsync(ipAddress, port).Wait(TimeSpan.FromSeconds(2));

我到处寻找,但没有找到解决方案。

感谢您的帮助

丹尼尔

工作解决方案 :

 public async Task<bool> IsConnected()
 {
        // Host IP Address and communication port
        string ipAddress = "192.168.0.11";
        int port = 9100;
        //Try to Connect with the host during 2 second
        {
            // Create TcpClient and try to connect
            using (TcpClient client = new TcpClient())
            { 
                //Create Tasks
                var clientTask = client.ConnectAsync(ipAddress, port);
                var delayTask = Task.Delay(2000);
                //Check which one finish first
                var completedTask = await Task.WhenAny(new[] {clientTask, delayTask});
                //Check if the connection have been established before the end of the timer 
                return completedTask == clientTask;
            }
        }
        catch (Exception exception)
        {
            // Problem with connection
            return false;
        }
}

添加另一个延迟任务,然后使用 Task.WhenAny 返回第一个完成的任务。
通过将已完成的任务与客户端任务进行比较,您将"决定"哪个任务首先完成

public async Task<bool> IsConnected()
{
    using (TcpClient client = new TcpClient())
    { 
        var clientTask = client.ConnectAsync(ipAddress, port);
        var delayTask = Task.Delay(2000);
        var completedTask = await Task.WhenAny(new[] {clientTask, delayTask});
        return completedTask == clientTask;
    }
}

请注意,ConnectAsync方法返回TaskTask<bool>

异步方法返回类型 Task 的值。任务包含有关异步方法状态(完成、正在运行、出错等)的信息

通过"等待",您将等待并观察任务的结果(完成或有异常故障)

所以基本上

// start connecting to host
var clientTask = client.ConnectAsync(ipAddress, port);
// start calculating elapsed time
var delayTask = Task.Delay(2000);

await Task.WhenAny将返回第一个完成的任务,或者如果第一个任务出现异常错误,则抛出异常。

最新更新