c# 让我的特定行在 x 秒后超时 c#

c# make my a specific line to timeout after x seconds c#

我在 C# 中有一行,它工作起来不是很可靠,根本不会超时,运行s 无限。

更准确地说,我正在尝试检查与代理的连接 WebClient.DownloadString

我希望它在 5 秒后超时而不使整个方法异步

所以代码应该是这样的:

bool success = false

do_this_for_maximum_5_seconds_or_until_we_reach_the_end
{
WebClient.DownloadString("testurl");
success = true;
}

它将尝试下载 testurl 并在下载后将成功设置为 true。如果 DownloadString 花费的时间超过 5 秒,调用将被取消,我们不会到达将成功设置为 true 的那一行,所以它仍然是 false,我知道它是字段。

当我们尝试 DownloadString 时线程将保持冻结状态,因此操作不会并行进行。与普通线路的唯一区别是我们在 5 秒后设置了超时

请不要建议使用 HttpClient 等替代方法,因为我在其他地方也需要类似的代码,所以我只想要一个可以在同步应用程序中 运行 的代码(我还没有学到任何关于异步编程因此我想完全避免它)

我的方法就像 Andrew Arnott 在这个帖子中建议的那样 Asynchronously wait for Task<T> to complete with timeout

但是我的问题是,我不确定他的示例中的变量“SomeOperationAsync()”是什么类型(我的意思是它看起来像是一项任务,但我如何才能将操作放入任务中?),以及更大的问题是 VS 想要将完整的方法切换为异步,但我想 运行 一切都同步,但只是针对特定代码行设置超时。

如果问题已在某处得到解答,请提供 link

感谢您的帮助!!

您应该使用 Microsoft 的 Reactive Framework(又名 Rx)- NuGet System.Reactive 并添加 using System.Reactive.Linq; - 然后您可以这样做:

var downloadString =
    Observable
        .Using(() => new WebClient(), wc => Observable.Start(() => wc.DownloadString("testurl")))
        .Select(x => new { success = true, result = x });

var timeout =
    Observable
        .Timer(TimeSpan.FromSeconds(5.0))
        .Select(x => new { success = false, result = (string)null });
        
var operation = Observable.Amb(downloadString, timeout);

var output = await operation;

if (output.success)
{
    Console.WriteLine(output.result);
}

第一个 observable 下载您的字符串。第二个设置超时。第三,使用 Amb 运算符获取两个输入可观察量中先完成的结果。

然后我们可以await第三个observable来获取它的值。然后检查您得到的结果是一项简单的任务。