Gérez les délais d'attente des tâches asynchrones avec élégance : annulez Task.Wait() dans les 5 secondes
La méthode GetFinalUrl
de ce code instancie par programme un navigateur Web, accède à une URL et renvoie l'URL finale une fois le chargement du document terminé. Afin d'arrêter la tâche lorsque le document se charge pendant plus de 5 secondes et que GetFinalUrl()
renvoie null, vous pouvez utiliser la méthode de tâche timeout. Voici le code modifié :
<code class="language-csharp">private Uri GetFinalUrl(PortalMerchant portalMerchant) { SetBrowserFeatureControl(); Uri finalUri = null; if (string.IsNullOrEmpty(portalMerchant.Url)) { return null; } Uri trackingUrl = new Uri(portalMerchant.Url); // 创建一个超时取消令牌源 using (var timeoutCts = new CancellationTokenSource(TimeSpan.FromSeconds(5))) { var task = MessageLoopWorker.Run(DoWorkAsync, trackingUrl, timeoutCts.Token); try { // 在超时时间内等待任务完成 task.Wait(timeoutCts.Token); if (!String.IsNullOrEmpty(task.Result?.ToString())) { return new Uri(task.Result.ToString()); } } catch (OperationCanceledException) { // 任务超时,返回null return null; } } throw new Exception("解析失败"); }</code>
Dans ce code modifié, un CancellationTokenSource(TimeSpan)
(timeoutCts) avec un timeout de 5 secondes est créé à l'aide du constructeur CancellationTokenSource
. Utilisez ensuite la méthode Wait(CancellationToken)
pour attendre que la tâche se termine dans le délai spécifié par CancellationToken
. Si la tâche n'est pas terminée dans le délai d'expiration, une exception OperationCanceledException
est levée et la méthode GetFinalUrl
renvoie null. Notez la vérification nulle ajoutée pour task.Result
pour éviter une potentielle NullReferenceException.
De cette façon, nous évitons efficacement les blocages prolongés et gérons les situations d'expiration potentielles avec élégance.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!