我在 C# 中有一條線,它運行起來不是很可靠,而且根本不會超時并且可以無限運行。
更準確地說,我正在嘗試檢查與代理 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,我知道它是欄位。
當我們嘗試下載字串時,執行緒將保持凍結狀態,因此該操作不會并行執行。與普通線路的唯一區別是我們在 5 秒后設定了超時
請不要建議使用 HttpClient 之類的替代方法,因為我在其他地方也需要類似的代碼,所以我只想要一個可以在同步應用程式中運行的代碼(我還沒有學到任何關于異步編程的知識,因此我想避免它完全地)
我的方法就像 Andrew Arnott 在這個執行緒中建議的那樣 異步等待 Task<T> 以超時完成
但是我的問題是,我不確定他的示例中的變數“SomeOperationAsync()”是什么型別的(我的意思是它看起來像是一項任務,但我怎樣才能將操作放入任務中?),更大的問題是VS 想將完整的方法切換為異步,但我想同步運行所有內容,但只需要特定代碼行的超時。
如果問題已在某處得到解答,請提供鏈接
感謝您的任何幫助!!
uj5u.com熱心網友回復:
您應該使用 Microsoft 的反應式框架(又名 Rx) - NuGetSystem.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運算子獲取兩個輸入 observable 中哪個最先完成的結果。
然后我們可以await通過第三個 observable 來獲取它的值。然后檢查你得到的結果是一項簡單的任務。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/482582.html
上一篇:如何同步子執行緒
