令牌取消时的TargetInvocationException

时间:2016-07-03 11:15:39

标签: c# winforms exception

我想创建一个在单独的线程(非GUI线程)上运行的任务。代码似乎运行良好,但我无法使取消逻辑工作。

enter image description here

我在Run中有一个Cancell按钮和GUI按钮。我取消了令牌 - 我得到了System.Reflection.TargetInvocationExceptionInnerMessage operation is cancelled说我个人对此没有任何问题:)

我应该担心这个例外吗?我应该怎么处理?我尝试了try - catch块,但它们没有抓住它。

使用VS2015。一些设置:

enter image description here

代码:

    public CancellationTokenSource ts;

    private async void button16_Click(object sender, EventArgs e)
    {
        await DoWork2();
    }

    public async Task DoWork2()
    {
        textBox1.AppendText("Started!");

        ts = new CancellationTokenSource();
        CancellationToken ct = ts.Token;

        await Task.Run(() => // async
        {
            while (true)
            {
                //Thread.Sleep(200);
                ct.ThrowIfCancellationRequested();
            }

        }, ct);

        ts.Cancel();

        textBox1.AppendText("Done!");
    }

    private void button28_Click(object sender, EventArgs e)
    {
        ts.Cancel();
    }

编辑:我能够解决上述代码的问题!在任务中添加了OperationCancelledException catch块。现在,上面的代码没有抛出异常。以下代码不是这种情况。

然而,我的计划比那复杂得多。对于与原始程序类似(但仍然简化)的代码,我得到了同样的异常:**

        List<int> list1 = new List<int>();
        for (int i = 0; i < 10; i++)
        {
            list1.Add(i);
        }

        await Task.Run(() => // async
        {
            try
            {
                while (true)
                {
                    Parallel.ForEach(list1, int2 =>
                    {
                        // {Cancellation Pending}
                        ct.ThrowIfCancellationRequested();
                    });
                }
            }
            catch (OperationCanceledException)// (OperationCanceledException ex)
            {

            }
        }, ct);

如您所见 - 我在任务中有并行循环。这一定是问题所在。在这种情况下,即使是catch块也无济于事。有什么想法吗?

EDIT2:好的,我也能解决第二个问题。 nice tutorial from Microsoft

      ParallelOptions po = new ParallelOptions();
      po.CancellationToken = ts.Token;

和内循环:

                while (true)
                {
                    Parallel.ForEach(list1, po, int2 =>
                    {
                       // {Cancellation Pending}
                        po.CancellationToken.ThrowIfCancellationRequested();
                    });
                }

对不起,这个问题现在已经解决,但也许有人想留下任何评论或者因为我采取的方法而责备我 - 如果没有评论,我会关闭这个问题

0 个答案:

没有答案