請教一下,Task.run()中有一個耗時的第三方方法,沒法用cancellationToken進行判斷取消,超過一定時間后,有其他辦法可以提前終止或者拋例外回傳嗎?
uj5u.com熱心網友回復:
假如一個士兵接到“靜默30分鐘”的命令,然后在第15分鐘,想讓他停止靜默,目前沒有有效的方法,因為靜默期間無法回應外部命令。uj5u.com熱心網友回復:
// 有回傳值
public static async Task<TResult> TimeoutAfter<TResult>(this Task<TResult> task, TimeSpan timeout)
{
using (var timeoutCancellationTokenSource = new CancellationTokenSource())
{
var completedTask = await Task.WhenAny(task, Task.Delay(timeout, timeoutCancellationTokenSource.Token));
if (completedTask == task)
{
timeoutCancellationTokenSource.Cancel();
return await task; // Very important in order to propagate exceptions
}
else
{
throw new TimeoutException("The operation has timed out.");
}
}
}
// 無回傳值
public static async Task TimeoutAfter(this Task task, TimeSpan timeout)
{
using (var timeoutCancellationTokenSource = new CancellationTokenSource())
{
var completedTask = await Task.WhenAny(task, Task.Delay(timeout, timeoutCancellationTokenSource.Token));
if (completedTask == task)
{
timeoutCancellationTokenSource.Cancel();
await task; // Very important in order to propagate exceptions
}
else
{
throw new TimeoutException("The operation has timed out.");
}
}
}
uj5u.com熱心網友回復:
目前的話也只能像2樓說的用WhenAny來實作了,但是拋了例外之后耗時任務可能還會一直跑著,無法監視轉載請註明出處,本文鏈接:https://www.uj5u.com/net/267863.html
標籤:C#
上一篇:控制元件失效的問題請教
