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来获取它的值。然后检查您得到的结果是一项简单的任务。
我在 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来获取它的值。然后检查您得到的结果是一项简单的任务。