У меня есть фрагмент кода, который планирует серию методов, которые я реорганизовал, чтобы дать больший контроль над остановкой и запуском указанных методов.
Проблема в том, что в моем рефакторированном коде я получаю '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 и используя токены вне массивов.