Почему мой cancellationTokenSource генерирует исключение нулевого объекта? - PullRequest
0 голосов
/ 16 мая 2019

У меня есть фрагмент кода, который планирует серию методов, которые я реорганизовал, чтобы дать больший контроль над остановкой и запуском указанных методов.

Проблема в том, что в моем рефакторированном коде я получаю 'Null ссылочное исключение »на моем токене отмены, который я не понимаю, поскольку я объявил его почти точно так же, только в массиве.

Оригинальный код:

public partial class Form1 : Form
{       
    int startTime1 = 0, startTime2 = 6, startTime3 = 12, startTime4 = 18;
    int startMin1 = 0, startMin2 = 0, startMin3 = 0, startMin4 = 0;        

    CancellationTokenSource ct1, ct2, ct3, ct4;
    Manager Launcher = new Manager();

    private void Form1_Load(object sender, EventArgs e)
    {}

    public Form1()
    {InitializeComponent();}  

  // AND A BUNCH OF METHODS

}

и т.д..

В этом классе я использую токены отмены с

public void RunCodeAt(int Number,  DateTime date)
    {
        switch (Number)
        {
            case 1:
                ct1 = new CancellationTokenSource();
                break;
            case 2:
                ct2 = new CancellationTokenSource();
                break;
            case 3:
                ct3 = new CancellationTokenSource();
                break;
            case 4:
                ct4 = new CancellationTokenSource();
                break;
        }
        var dateNow = DateTime.Now;
        TimeSpan ts;
        if (date > dateNow)
        {
            ts = date - dateNow;
        }
        else
        {
            date = GetNextDate(date);
            ts = date - dateNow;
        }



        switch (Number)
        {
            case 1:
                Task.Delay(ts).ContinueWith((x0) =>
                {
                    methodToCall(date,Number);
                    RunCodeAt(Number, GetNextDate(date)); // Schedule next run.
                }, ct1.Token);
                break;
            case 2:
                Task.Delay(ts).ContinueWith((x0) =>
                {
                    methodToCall(date, Number);
                    RunCodeAt(Number, GetNextDate(date)); // Schedule next run.
                }, ct2.Token);
                break;
            case 3:
                Task.Delay(ts).ContinueWith((x0) =>
                {
                    methodToCall(date, Number);
                    RunCodeAt(Number, GetNextDate(date)); // Schedule next run.
                }, ct3.Token);
                break;
            case 4:
                Task.Delay(ts).ContinueWith((x0) =>
                {
                    methodToCall(date, Number);
                    RunCodeAt(Number, GetNextDate(date)); // Schedule next run.
                }, ct4.Token);
                break;
        }
    } // RunCodeAt()

Так почему, когда я пытаюсь реализовать массив как таковой ...


public partial class Form1 : Form
    {

            public int[] SH = { 12, 13, 14, 15, 16, 17, 18, 19 };
            public int[] EH = { 12, 13, 14, 15, 16, 17, 18, 19 };
            public int[] SM = { 00, 00, 00, 00, 00, 00, 00, 00 };
            public int[] EM = { 59, 59, 59, 59, 59, 59, 59, 59 };


        public CancellationTokenSource[] cts = new CancellationTokenSource[8];
        public CancellationTokenSource[] ctc = new CancellationTokenSource[8]; // Cancellation token start and close

и т. Д.

делает

 public void BeginInstancAt(int Number, DateTime date)
        {
            cts[Number] = new CancellationTokenSource();
            try
            {                
                var dateNow = DateTime.Now;
                TimeSpan ts;
                if (date > dateNow)
                {
                    ts = date - dateNow;
                }
                else
                {
                    date = GetNextDate(date);
                    ts = date - dateNow;
                }

                Task.Delay(ts).ContinueWith((x0) =>
                {
                    startClientScheduled(date, Number);
                    BeginInstancAt(Number, GetNextDate(date)); // Schedule next run.
                }, cts[Number].Token);
            }
            catch (Exception cuntflaps)
            {
                MessageBox.Show("FATAL INITIATION SCHEDULING EXCEPTION");
                Console.WriteLine(cuntflaps.ToString());
            }


        }

результат в

System.NullReferenceException: Object reference not set to an instance of an object.
   at SchedulerV1_0.Form1.BeginInstancAt(Int32 Number, DateTime date)
Exception thrown: 'System.NullReferenceException' in SchedulerV1_0.exe

Быть брошенным в первую строку в начале строки?

Если при наведении мыши на cts [число] в beginInstanceAt () оно показывает поле cancellationtokensource [] Form1.cts, предполагая, что оно действительно имеет доступ к полю.

Я должен добавить, что мне удалось заставить этот код работать, используя операторы switch и используя токены вне массивов.

...