Сейчас я устраняю конфликты моего последовательного порта, используя пару логических значений. Моя разработка происходит на неподключенной машине, но вот соответствующая структура для того, что я делаю.
Код: Выделить всё
class MyCoolGadget
{
private bool updateInProgress;
private bool commandInProgress;
private System.Windows.Forms.Timer updateTimer = new System.Windows.Forms.Timer();
public MyCoolGadget()
{
updateTimer.Interval = 1000;
updateTimer.Tick += new EventHandler(updateCallback);
updateInProgress = false;
commandInProgress = false;
// Other constructor stuff
}
private void updateCallback(object sender, EventArgs e)
{
Update();
}
// This method is called by other class methods as well as by GUI element callbacks
public byte[] sendCommand(byte id, byte[] payload)
{
string caller = new System.Diagnostics.StackFrame(1).GetMethod().Name;
// Loop here checks to see if there is an update is in progress and it needs to wait
// for the serial port. If Update is the caller, we ignore the wait or we get stuck
// in an infinite loop. This is part of what i want to clean up.
while (updateInProgress && (caller != "Update"))
{
Thread.Sleep(25);
}
if (caller != "Update")
{
commandInProgress = true;
}
// Build message, send it, get answer
if (caller != "Update")
{
commandInProgress = false;
}
return answer;
}
// This method is called every second by the timer's callback
private void Update()
{
byte[] replyBuffer;
while (commandInProgress)
{
Thread.Sleep(10);
}
updateInProgress = true;
replyBuffer = sendCommand(id1, payload1);
// Update properties based on reply. GUI elements bound to class properties so they update
// without further action on my part.
replyBuffer = sendCommand(id2, payload2);
// Update properties based on reply.
replyBuffer = sendCommand(id3, payload3);
// Update properties based on reply.
updateInProgress = false;
}
}
Моя конечная цель состоит в том, чтобы метод Update вызывался в фоновом потоке, чтобы графический интерфейс не зависал, и когда действие пользователя запрашивает отправку сообщения (в большинстве случаев нажатие кнопки), это сообщение не происходит. t перекрывать обновление. Я почти уверен, что асинхронные методы и await вступят в игру, но когда я пытаюсь их использовать, я получаю ошибки и не нашел примеров, которые я мог бы понять. Я также изучил делегаты, но примеры, которые я вижу, просто выглядят как использование метода для вызова метода, и я не вижу, как это перемещает что-либо на задний план. Примеры с пояснениями, адаптированными для аппаратного специалиста, приветствуются.
Заранее спасибо!
Подробнее здесь: https://stackoverflow.com/questions/785 ... -click-act