Dalam kod ini,
mulakan pada thread baru dengan pam mesej dan lakukan tugas pada benang. Kemudian tunggu tugas pada benang utama untuk menyekat benang utama sehingga tugas selesai. MessageLoopWorker.Run
DoWorkAsync
Untuk membatalkan tugas demi masa, anda boleh menggunakan kelas
membolehkan anda membatalkan permintaan dari satu thread ke yang lain. CancellationToken
CancellationToken
Berikut adalah kaedah mengubah kod untuk membatalkan tugas selepas lebih masa:
Dalam kod ini, kami membuat
private Uri GetFinalUrl(PortalMerchant portalMerchant) { SetBrowserFeatureControl(); Uri finalUri = null; if (string.IsNullOrEmpty(portalMerchant.Url)) { return null; } Uri trackingUrl = new Uri(portalMerchant.Url); // 创建一个 CancellationTokenSource。 using (CancellationTokenSource cancellationTokenSource = new CancellationTokenSource()) { // 设置 5 秒的超时时间。 using (Timer timer = new Timer(state => cancellationTokenSource.Cancel(), null, 5000, Timeout.Infinite)) { try { // 使用 CancellationToken 启动任务。 var task = MessageLoopWorker.Run(DoWorkAsync, cancellationTokenSource.Token, trackingUrl); // 等待任务完成。 task.Wait(cancellationTokenSource.Token); // 如果任务成功完成,获取结果。 if (!string.IsNullOrEmpty(task.Result?.ToString())) { return new Uri(task.Result.ToString()); } } catch (OperationCanceledException) { // 任务被取消。 } catch (AggregateException ex) { // 处理任务中的其他异常 foreach (var innerException in ex.InnerExceptions) { // Log or handle inner exception appropriately Console.WriteLine($"Inner Exception: {innerException.Message}"); } } } } // 如果任务被取消或失败,则返回 null。 return null; }
. Kami juga menetapkan pemasa untuk membatalkan token selepas 5 saat. Sekiranya tugas itu berjaya diselesaikan sebelum lebih masa, kami akan mendapat hasilnya. Jika tugas dibatalkan, kami akan menangkap CancellationTokenSource
. Akhirnya, kami menggunakan kenyataan untuk melepaskan sumber CancellationToken
dan MessageLoopWorker.Run
untuk memastikan sumber -sumbernya diproses dengan betul. Di samping itu, rawatan OperationCanceledException
ditambah untuk menangkap dan mengendalikan keabnormalan lain yang mungkin berlaku dalam misi using
. CancellationTokenSource
Timer
versi yang lebih baik menggunakan AggregateException
pernyataan untuk pengurusan sumber yang betul, mencegah kebocoran sumber
Atas ialah kandungan terperinci Bagaimana untuk Membatalkan Task.Wait() Selepas Tamat Masa dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!