У меня есть класс CAN-устройств низкого уровня, для которого я хотел бы создать событие onMessageReceive.У меня есть несколько классов устройств высокого уровня, которые могут использовать экземпляр этого класса CAN.Я хотел бы присоединить анализатор сообщений класса устройств высокого уровня к событию onMessageReceive устройства CAN низкого уровня.Таким образом, когда низкоуровневый класс принимает пакет, он анализируется в высокоуровневом классе с помощью задачи низкоуровневого считывателя.Вставить в код это будет выглядеть следующим образом:
void Main()
{
try
{
using (HighLevelDevice highLevelDevice = new HighLevelDevice())
{
while (true)
{
// Use the properties/fields in highLevelDevice to make testing decisions.
}
}
}
catch (Exception)
{
// If the low level CAN reader task encounters an error I would like for it to asynchronously propogate up to here.
throw;
}
}
public class HighLevelDevice
{
private LowLevelCan lowLevelCanInstance;
public HighLevelDevice()
{
lowLevelCanInstance = new LowLevelCan(this.ProcessPacket);
}
private void ProcessPacket(Packet packet)
{
// Convert packet contents into high level device properties/fields.
}
}
public class LowLevelCan
{
private delegate void ProcessPacketDelegate(Packet packet);
private ProcessPacketDelegate processPacket;
private Task readerTask;
public LowLevelCan(Action<Packet> processPacketFunction)
{
processPacket = new ProcessPacketDelegate(processPacketFunction);
readerTask = Task.Run(() => readerMethod());
}
private async Task readerMethod()
{
while(notCancelled) // This would be a cancellation token, but I left that out for simplicity.
{
processPacket(await Task.Run(() => getNextPacket()));
}
}
private Packet getNextPacket()
{
// Wait for next packet and then return it.
return new Packet();
}
}
public class Packet
{
// Data packet fields would go here.
}
Если в getNextPacket выдается исключение, я бы хотел, чтобы это было перехвачено в main.Это возможно каким-либо образом?Если я далеко от базы и совершенно не понимаю асинхронность, я прошу прощения.Если что-то подобное возможно, как я могу изменить свой подход для достижения этого?Я мог бы периодически проверять состояние читателя, но я хотел бы избежать этого, если это возможно.
Эта реализация убьет читателя, но поток highLevelDevice продолжает игнорироваться.Это было бы хорошо, если бы я сохранил ошибку и периодически проверял состояние в главном потоке.Я просто хотел бы найти решение, которое позволит избежать этого, если это возможно.
Я пробовал различные варианты сообщений об ошибках и отчетов о ходе работы, созданных в потоке, в котором завершается highLevelDevice.Они не работают должным образом / или я не понимаю, что они делают правильно.