【问题标题】:C# - TcpClient asynchronous connection with specific time durationC# - 具有特定持续时间的 TcpClient 异步连接
【发布时间】:2017-05-21 08:05:33
【问题描述】:

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

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

我的功能:

 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;
        }
}

【问题讨论】:

  • client.Close 在那里是多余的,因为您已经使用了usingclient.Dispose(),无论如何都会执行关闭连接。实际上client.Close() 执行client.Dispose()
  • 谢谢 fabio :) 我会改变我的工作解决方案

标签: c# asynchronous connection task tcpclient


【解决方案1】:

添加另一个延迟任务,然后使用返回第一个完成任务的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 方法返回Task 而不是Task&lt;bool&gt;

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

通过“等待”,您将等待并观察任务的结果(已完成或因异常而出错)

基本上是这样

// start connecting to host
var clientTask = client.ConnectAsync(ipAddress, port);

// start calculating elapsed time
var delayTask = Task.Delay(2000);

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

【讨论】:

  • 非常感谢,这是一个非常好的主意,而且效果很好:)
猜你喜欢
  • 2020-11-26
  • 2017-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多