Ok, fin qui ti seguo, sbaglio qualcosa allora, dunque questo è il codice eseguito dal thread:
c'è il while true che esegue fin che nono arriva il token di ritorno.
public void SendCyclicMessage(Message message, CancellationToken cancelToken)
{
try
{
XLDefine.XL_Status txStatus;
XLClass.xl_event_collection xlEventCollection = new XLClass.xl_event_collection(1);
xlEventCollection.xlEvent[0].tagData.can_Msg.id = message.Id;
xlEventCollection.xlEvent[0].tagData.can_Msg.dlc = message.Dlc;
xlEventCollection.xlEvent[0].tagData.can_Msg.id = message.Id;
xlEventCollection.xlEvent[0].tagData.can_Msg.dlc = message.Dlc;
for (int i = 0; i < message.Dlc; ++i)
{
xlEventCollection.xlEvent[0].tagData.can_Msg.data[i] = message.Bytes[i];
}
xlEventCollection.xlEvent[0].tag = XLDefine.XL_EventTags.XL_TRANSMIT_MSG;
while (true)
{
// Transmit events on txMask = Channel
txStatus = CANDriver.XL_CanTransmit(portHandle, accessMask, xlEventCollection);
Thread.Sleep(message.CycleTime);
if (txStatus != 0)
{
Console.WriteLine("Message transmission failed!", "Error Message");
}
if (cancelToken.IsCancellationRequested) //cancel token sended to stop thread
{
return;
}
}
}
catch (Exception ex)
{
// return;
Console.WriteLine("Error from method: " + "sendCyclicMessage: " + ex.Message);
}
}
Per farlo partire, da un'altra classe, inizializzo il token:
CancellationTokenSource tokenSource = new CancellationTokenSource();
CancellationToken CancellationToken = tokenSource.Token;
poi faccio partire il thread sempre dalla classe dove ho creato il token:
taskList.Add(new Thread(() => vector.SendCyclicMessage(msgToSend, CancellationToken)));
taskList.Last().Name = msgToSend.Name;
taskList.Last().Start();
poi in fondo alla sezione quando ho finito:
tokenSource.Cancel(); //KILL ALL THREADS AND LIST
Ma mi restano in pending........