首页 > 解决方案 > tcp客户端在c#中使用超时异步连接

问题描述

我正在寻找一种与超时异步设置 tcpclient 连接的方法,我试图在如何为 TcpClient 设置超时?,但这对我不起作用,我将设置代码放入一个任务中以避免阻塞主线程,需要超时,因为设置过程可能需要超过 1 分钟才能失败。请帮助我使超时工作。

using System;
using System.Net.Sockets;
using System.Threading;
using System.Threading.Tasks;

namespace test
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            Connect();

            int seconds = 0;
            while (true)
            {
                Console.WriteLine("time elapsed: " + seconds.ToString());
                Thread.Sleep(1000);
                seconds += 1;
            }
        }

        public static async void Connect()
        {
            Tcp tcp = new Tcp();

            await tcp.BeginConnect("apple.com", 3);

            Console.WriteLine("connect end.");
        }
    }

    class Tcp
    {
        public async Task BeginConnect(string ip, int port)
        {
            var client = new TcpClient();
            Console.WriteLine("start connecting.");
            try
            {
                var succeed = false;
                await Task.Run(() =>
                {
                    var result = client.BeginConnect(ip, port, null, null);
                    succeed = result.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(5)); // timeout doesn't work
                    client.EndConnect(result);
                });

                if (succeed && client.Connected)
                {
                    Console.WriteLine("connected to server.");
                }
                else
                {
                    Console.WriteLine("failed to connect to server.");
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("exception: " + e.ToString());
            }
        }
    }
}

connect方法没有按预期在5秒后结束,只要抛出异常,client.BeginConnect(ip,port,null,null)之后的代码;永远不会被执行。

标签: c#asynchronoustimeouttcpclient

解决方案


推荐阅读