"可能无法在已完成的任务上调用“开始”#34;未启动任务的异常

时间:2016-06-01 09:58:24

标签: c# asynchronous xamarin task cancellationtokensource

我正在开发一个使用Xamarin开发的移动应用程序,我不时地收到报告,其中应用程序因以下异常而崩溃:

  

System.InvalidOperationException可能无法在已完成的任务上调用Start。

为了清楚起见,这或多或少是函数的结构:

    CancellationTokenSource tokenSource;

    void Function(bool condition1, bool condition2)
    {
        if (tokenSource != null)
        {
            tokenSource.Cancel();
            tokenSource.Dispose();
            tokenSource = null;
        }

        Task completionTask = null;

        if (condition1)
        {
            tokenSource = new CancellationTokenSource();
            completionTask = new Task(async () =>
                {
                    await Task.Delay(1000);
                    if (tokenSource != null && !tokenSource.IsCancellationRequested)
                    {
                        InvokeOnMainThread(Function2);
                    }
                }, tokenSource.Token);
        }

        if (condition2)
        {
            TaskFactory.StartNew(() =>
                {
                  ...
                }).ContinueWith(() =>
                {
                    if (completionTask != null)
                    {
                        completionTask.Start();
                    }
                });
        }
        else
        {
            if (completionTask != null)
            {
                completionTask.Start();
            }
        }
    }

    void Function2()
    {
        if (tokenSource != null)
        {
            tokenSource.Cancel();
            tokenSource.Dispose();
            tokenSource = null;
        }
    }

我无法重现错误,而且我也不确定completionTask是如何启动的,因为它只能启动一次。即使由于任何原因Function按顺序调用,或由多个线程调用,这也不会导致任何问题,因为completionTask是一个局部变量。

关于可能是什么原因的任何想法?

1 个答案:

答案 0 :(得分:0)

我认为这是cancelToken上的竞争条件,因为它跨越多个函数调用。 因此,您可以尝试启动由function2取消的任务或另一个对同一函数的调用。