微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 c# 函数中设置超时?

如何解决如何在 c# 函数中设置超时?

我最近在我的 c# 程序中创建了一个函数,它执行一些查询和其他东西,我想知道是否有办法为该函数设置超时: 特别是如果函数在 10 分钟后没有完全执行,我希望我的程序能够停止。 我也想知道能不能在函数本身内部实现这个控件,以免每次调用都写。

解决方法

最好的方法是让方法采用 cancellationToken。它需要经常检查这个令牌,如果它已被取消则中止。创建一个在超时后取消的令牌,方法是创建一个 cancelTokenSource: new CancellationTokenSource(timeout) 并将它拥有的令牌交给函数。对于长时间运行的方法,最好采用取消令牌和某种方式报告进度。

如果没有办法修改函数,替代方法可能是这样的:

    public async Task<(T Result,bool Completed)> RunTimeoutFunction<T>(Func<T> func,TimeSpan timeout)
    {
        var funcTask = Task.Run(func);
        var timeoutTask = Task.Delay(timeout);
        var completedTask = await Task.WhenAny(funcTask,timeoutTask);
        if (completedTask == timeoutTask)
        {
            return (default,false);
        }

        return (funcTask.Result,true);
    }

明显的缺点是即使超时后该函数仍将继续在后台运行。然而,这是不可避免的,除非可以合作取消该功能。第三种选择是将该函数放在一个单独的进程中,然后您可以在超时后安全地终止该进程。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。