c# 调用接口,避免接口内部卡死,实现超时退出 3.0

csharp 复制代码
using System;
using System.Threading;

public class Program
{
    public static void Main()
    {
        // 创建一个新的线程来调用接口
        Thread thread = new Thread(CallCInterface);
        thread.Start();

        // 等待一段时间,如果超时则中断线程
        bool timeout = !thread.Join(TimeSpan.FromSeconds(5)); // 设置超时时间为5秒
        if (timeout)
        {
            thread.Abort(); // 中断线程
            Console.WriteLine("C interface call timed out.");
        }
        else
        {
            Console.WriteLine("C interface call completed successfully.");
        }
        Console.ReadKey();
    }

    public static void CallCInterface()
    {
        int i = 0;

        while(true)
        {
            Console.WriteLine(i++);
            Thread.Sleep(1000);
        }
    }
}

虽然使用Thread类和Join方法设置连接超时时间,但是在连接超时时直接中止线程并抛出异常是不安全的,并且未正确处理连接超时的情况。建议使用异步方法和Task来处理连接超时

csharp 复制代码
                 _client = new TcpClient();
                var connectTask = _client.ConnectAsync(_ip, _port);
                var timeout = Task.Delay(_connectTimeout);

                await Task.WhenAny(connectTask, timeout);

                if (!connectTask.IsCompleted)
                {
                    throw new TimeoutException("连接超时");
                }

添加一个CancellationToken参数,以便能够在需要时取消异步操作。

csharp 复制代码
                    using (var cts = new CancellationTokenSource())
                    {
                        cts.CancelAfter(_connectTimeout);

                        var connectTask = _client.ConnectAsync(_ip, _port);
                        var timeout = Task.Delay(_connectTimeout, cts.Token);

                        await Task.WhenAny(connectTask, timeout);

                        if (!connectTask.IsCompleted)
                        {
                            throw new TimeoutException("连接超时");
                        }
                    }
相关推荐
品尚公益团队3 小时前
C#在asp.net网页开发中的带cookie登录实现
前端·c#·asp.net
bksczm3 小时前
Linux之信号量(POSIX标准)
java·开发语言
吴可可1233 小时前
C#自定义CAD多段线零件实体
c#
吠品3 小时前
PHP里取月份最后一天的几种方式
java·开发语言·eureka
CallmeFoureyes3 小时前
使用 C# 提取 Word 文档中的表格数据
开发语言·c#·word
gugucoding3 小时前
2. 【Java】搭建Java开发环境
java·开发语言
多加点辣也没关系3 小时前
JavaScript|第9章:对象 — 基础
开发语言·javascript·ecmascript
2601_949818093 小时前
Vector从入门到应用(C++ STL动态数组万字全解
开发语言·c++
汤米粥4 小时前
Python爬虫中Xpath用法之——normalize-space()
开发语言·python
科技道人4 小时前
记录 设置-显示大小和字体
开发语言·android设置·字体和显示大小