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

标签 c# asynchronous connection task 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方法返回 Task不是 Task<bool> .

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

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

基本上是这样

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

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

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

关于C# - 具有特定持续时间的 TcpClient 异步连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41507750/

相关文章:

ios - 从 Swift 函数中的异步调用返回数据

python - cursor.description "type_code"对应数据库字段类型

c# - Apache NMS - 如何确定连接是否已启动

google-chrome - SSL协议(protocol)错误

java - 使用领域驱动设计建模多对多关系

c# - 在 WebBrowser 控件中注入(inject) CSS

c# - TreeViews 上的附加属性

c# - 当您想在从接口(interface)继承的不同类之间进行选择时,如何不违反 OCP?

python - 为异步 Tornado Web 套接字服务器编写同步测试套件

android - iOS/Objective-C 相当于 Android 的 AsyncTask