需要知道以下的知識
正規的騷操作:https://stackoverflow.com/questions/4238345/asynchronously-wait-for-taskt-to-complete-with-timeout
參考資料:https://walterlv.com/post/task-wait-async-with-timeout.html#%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99
開始我們的講解吧
假如我們需要這樣的游戲規則,在規定的時間內沒有完成有關功能,就自動提示超時。
為了保證這個功能足夠簡單又能夠說明清楚,我們加入朴素的素數判定
private static bool IsPrime(long num) { bool isPrime = false; if (num == 1) { return true; } for (var i = 2; i < num; i++) { if (num % i != 0) continue; isPrime = true; break; } return isPrime; } private static int ForPrime(int num) { int numPrime = 0; for (var i = 1; i <= num; i++) { numPrime += IsPrime(i)? 0 : 1; } return numPrime; } public static async Task<int> PrimeTask() { int val = await Task.Run(() => ForPrime(100000)); return val; }
雖然不知道處理100000個數字耗時多少,但肯定1s是跑不完的,so。。。如果我們需要在它超過1s之后提示呢,隨便提示啥都行。
public static async Task<bool> TimeTask() { var task = PrimeTask(); int timeout = 1000; if (await Task.WhenAny(task, Task.Delay(timeout)) == task) { return true; } return false; }
代碼說明一下就是1s內處理完畢就返回true,否則就是false。
static void Main(string[] args) { Task<bool> t = TimeTask(); Console.WriteLine(t.Result); Console.ReadKey(); }
最后簡單的超時機制就弄好了~~