مشاركة عبر


كيفية القيام بما يلي: قم بتسجيل عمليات الاسترجاعات لطلبات الإلغاء

يوضح المثال التالي كيفية إلى تسجيل مفوض الذي سيتم استدعاؤه عند IsCancellationRequestedتصبح الخاصية true نتيجة إلى استدعاء إلى Cancelتشغيل الكائن الذي تم إنشاؤه إلى ken. استخدام هذه التقنية لإلغاء غير متزامن العمليات التي لا تعتمد بشكل أصلي إطار عمل موحد للإلغاء، ومن أجل إلغاء حظر الأساليب التي قد تكون انتظار غير متزامن حتى انتهاء العملية.

ملاحظةملاحظة

عند "فقط رمز مجلد" هو ممكناً، إلى قطع Studio Vهوual في بعض الحالات تشغيل الخط الذي يطرح ‏‏ استثناء و dهوplay رسالة خطأ تقول "لم يتم التعامل معها من قبل مستخدم رمز ‏‏ استثناء." وهذا خطأ هو benign.اضغط على F5 إلى متابعة منه، ومشاهدة سلوك معالجة الاستثناءات التي يتم هو موضح في الأمثلة أدناه.لمنع الانفصال عن الخطأ أول ‏‫Visual Studio، فقط إلغاء تحديد "فقط الخاصة بي تعليمات برمجية" خانة الاختيار تحت أدوات، خيارات، تصحيح، عام.

مثال

في المثال التالي، WebClient.CancelAsyncأسلوب مسجَّل كأسلوب لطلبة عندما يتم طلب الإلغاء من خلال رمز الإلغاء.



Class CancelWithCallback


    Shared Sub Main()

        Dim cts As New CancellationTokenSource()

        ' Start cancelable task.
        Dim t As Task = Task.Factory.StartNew(Sub() DoWork(cts.Token))

        Console.WriteLine("Press 'c' to cancel.")
        Dim ch As Char = Console.ReadKey().KeyChar
        If ch = "c"c Then

            cts.Cancel()
        End If
        Console.WriteLine("Press any key to exit.")
        Console.ReadKey()
    End Sub

    Shared Sub DoWork(ByVal token As CancellationToken)

        Dim wc As New WebClient()

        ' Create an event handler to receive the result.
        AddHandler wc.DownloadStringCompleted, Sub(obj, e)

                                                   ' Checks status of WebClient, not external token
                                                   If e.Cancelled = False Then

                                                       Console.WriteLine(e.Result + "\r\nPress any key.")

                                                   Else
                                                       Console.WriteLine("Download was canceled.")
                                                   End If
                                               End Sub

        token.Register(Sub() wc.CancelAsync())

        Console.WriteLine("Starting request")
        wc.DownloadStringAsync(New Uri("https://www.contoso.com"))
    End Sub
End Class
namespace Cancel3
{
    using System;
    using System.Net;
    using System.Threading;
    using System.Threading.Tasks;

    class CancelWithCallback
    {

        static void Main(string[] args)
        {
            var cts = new CancellationTokenSource();

            // Start cancelable task.
            Task t = Task.Factory.StartNew(() =>
            {
                DoWork(cts.Token);
            });

            Console.WriteLine("Press 'c' to cancel.");
            char ch = Console.ReadKey().KeyChar;
            if (ch == 'c')
            {
                cts.Cancel();
            }
            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }

        static void DoWork(CancellationToken token)
        {
            WebClient wc = new WebClient();

            // Create an event handler to receive the result.
            wc.DownloadStringCompleted += (obj, e) =>
            {
                // Checks status of WebClient, not external token
                if (!e.Cancelled)
                {
                    Console.WriteLine(e.Result + "\r\nPress any key.");
                }
                else
                    Console.WriteLine("Download was canceled.");
            };

            // Do not initiate download if the external token
            // has already been canceled.
            if (!token.IsCancellationRequested)
            {
                // Register the callback to a method that can unblock.
                // Dispose of the CancellationTokenRegistration object
                // after the callback has completed.
                using (CancellationTokenRegistration ctr = token.Register(() => wc.CancelAsync()))
                {
                    Console.WriteLine("Starting request");
                    wc.DownloadStringAsync(new Uri("https://www.contoso.com"));
                }
            }
        }
    }
}

إذا كان الفعل قد تم إلغاء طلب وقت رد الاتصال هو regهوtered، رد الاتصال هو لا يزال مضموناً باستدعاء. في ترتيب هو الحالة بالتحديد، CancelAsyncسيفعله أي شيء في حالة عدم وجود عملية غير متزامنة أسلوب هو قيد التقدم، حيث أنه هو اﻷمن دوماً لاستدعاء الأسلوب.

راجع أيضًا:

موارد أخرى

الإلغاء