繁体   English   中英

CancellationTokenSource.Cancel(假)

[英]CancellationTokenSource.Cancel(false)

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

        ThreadPool.QueueUserWorkItem(o => DoWork(cts.Token, 100));

        Thread.Sleep(500);

        try
        {
            cts.Token.Register(CancelCallback3);
            cts.Token.Register(CancelCallback2);
            cts.Token.Register(CancelCallback1);



            cts.Cancel(false);
        }
        catch (AggregateException ex)
        {
            foreach (Exception curEx in ex.Data)
            {
                Trace.WriteLine(curEx.ToString());    
            }

        }

        Console.ReadKey();
    }

    private static void CancelCallback1()
    {
        Trace.WriteLine("CancelCallback1 was called");
        throw new Exception("CancellCallback1 exception");
    }


    private static void CancelCallback2()
    {
        Trace.WriteLine("CancelCallback2 was called");
        throw new Exception("CancellCallback2 exception");
    }

    private static void CancelCallback3()
    {
        Trace.WriteLine("CancelCallback3 was called");
    }

    private static void DoWork(CancellationToken cancellationToken, int maxLength)
    {
        int i = 0;
        while (i < maxLength && !cancellationToken.IsCancellationRequested)
        {
            Trace.WriteLine(i++);
            Thread.Sleep(100);
        }
    }

输出为:

0
1
2
3
4
CancelCallback1 was called

根据http://msdn.microsoft.com/zh-cn/library/dd321703.aspx的预期,我希望获得AggregateException,看来throwOnFirstException参数在这里没有任何意义。 我的代码有什么问题。

您需要使用Task <>类来获取AggregateException。 它替代ThreadPool.QueueUserWorkItem()。

问题在于缺乏在Visual Studio中的强大调试经验。 我的VS调试器设置被设置为在第一次出现异常时停止。

仅供参考CancellationTokenSource.Cancel(false)与ThreadPool以及与Tasks一起正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM