Мое приложение подключено ко многим внешним устройствам через протокол TCP / IP и COM-порты. Основная логика находится в классе MainController
(реализованном как конечный автомат), который прослушивает сигналы от внешних устройств и отправляет им команды.
Каждый раз, когда MainController
получает внешний сигнал, он уведомляет графический интерфейс с событием, например OnSensor1Received
, _4 _, ... так что я могу отобразить значок или сообщение или что-то еще. Та же логика применима и для другого направления - когда MainController
отправляет сигнал на внешнее устройство, возникает событие и что-то отображается в графическом интерфейсе.
Пока здесь все коммуникации асинхронны (если это правильный термин?). Это означает, что я получаю события и обрабатываю их, и я запускаю команды, но никогда не жду возврата в той же операции (можно сказать, что все методы отправки команд недействительны).
Но теперь мне нужно добавить новое устройство, в котором есть только один общедоступный метод int Process(string input, out string output)
. Выполнение метода может занять до пары секунд, а пока весь другой код ожидает - например, если во время выполнения этого метода я получаю сигнал от другого внешнего устройства, графический интерфейс будет обновлен только после блокировки. метод Write
выполняется. Как я могу заставить метод Write
выполняться асинхронно, чтобы графический интерфейс отображал все другие сигналы в реальном времени?
Пример кода, это вызывается где-то в MainController
, когда я пытаюсь использовать новое устройство:
// Notify GUI that the blocking plugin was activated.
OnBlockingPluginActive(this, EventArgs.Empty);
string result;
// Here is the problem - during the execution of this method the GUI is not responding for other signals.
var status = blockingPlugin.Process(input, out result);
if (status == 0)
{
// OK, notify GUI and fire a BlockingPluginOK command in finite state machine.
OnBlockingPluginOK(this, EventArgs.Empty);
}
else
{
// Error, notify GUI and fire a BlockingPluginError command in finite state machine.
OnBlockingPluginError(this, EventArgs.Empty);
}
Также обратите внимание, что я использую .net 4.0 и не могу перейти на 4.5, поэтому нет встроенной поддержки async / await.