C# блокировка ожидания ответа, снова
На этот вопрос спрашивали, как сообщать запросы и получать ответы. Я тоже хочу отправлять запросы на действия и информацию. Некоторые из этих запросов будут принимать параметры, большинство - нет. И из ответов, почти все отправят обратно "ОК", но другие отправят мне информацию. Два конца ссылки ничего не знают друг о друге, кроме этого протокола команд. ОП получил ответ, рассказав ему, как обернуть код.
Я был ошеломлен такими ответами, рассказывающими мне, какие технологии использовать, как обернуть код и т. Д.; и так как я занимаюсь совершенно новыми разработками с использованием новейших инструментов, я нашел и согласился с тем, что хочу использовать TAP, как ответил Джон Скит на OP на этот вопрос. Я думаю, что теперь я знаю, как обернуть мой код. Однако мой вопрос не в том, какую технологию использовать, а в том, как использовать async/await.
Но как этот код выглядит? Какие методы / параметры и т. Д. Используются для отправки запросов и получения ответов? Как установить связь между двумя сторонами, которые не могут найти друг друга? Как мне включить параметр? И т.п.
Я хочу использовать шаблон "Стратегия", чтобы в одном случае два конца были формами, а команды - результатом нажатия кнопок, параметрами текстовых полей. Эта форма существует. И вторая стратегия, которая еще не написана, заключается в том, чтобы две стороны могли общаться по сети между компьютерами. Сервер будет службой Windows, а командный модуль - формой, которая будет отправлять команды в ответ на автоматизацию производственной линии.
Это не помогает мне сказать: "Используйте RPC" или "используйте сокет". Что такое RPC? И как код сокета относится к части, которая отправляет команды... как выглядит код?
Скажи, что у меня есть:
public async void SendCommandAsync(Command c, Parameters p)
{
string response;
await response = SendAsync(c, p);
}
Что необходимо иметь до вызова этой функции? А что такое SendAsync()? Как это общаться с удаленным слушателем? Какой параллелизм существует между двумя стратегиями, одна из которых обменивается данными по сети с SOAP или HTTP, а другая - на одном компьютере, одна форма - другой?
Спасибо, что смирился с моим невежеством.
1 ответ
HTTP-протокол, кажется, то, что вы ищете. Он выполняет одну пару запрос / ответ с удаленным хостом по TCP. Отдельные запросы и соответствующие ответы являются независимыми. HTTP по существу дает вам функцию вида:
byte[] response = Request(string remoteUrl, byte[] request);
Все внутри этой функции автоматизировано библиотеками. То же самое относится и к серверу.
Если вы хотите общаться, используя структурированные данные (деревья объектов), вам, вероятно, следует использовать веб-сервисы (возможно, на основе SOAP). Они представляют собой слой поверх HTTP и позволяют отправлять / получать объекты вместо байтовых массивов.
Что касается шаблона стратегии: шаблон можно разместить на разных слоях.
- Если вы хотите использовать протокол TCP (который работает и для локальной петли), вам нужно только изменить IP-адрес и порт удаленной конечной точки.
- Если вы не хотите принимать TCP, вы можете предположить, что двунаправленный
Stream
существует для обмена сообщениями. HTTP может работать над любым потоком вообще. На локальных соединениях вы можете использовать именованные каналы. В процессе вы можете использоватьMemoryStream
, - Или вы полностью абстрагируете весь транспортный аспект, предполагая, что функция формы
object response = Request(object request);
существует. Эта функция может поддерживаться SOAP-over-HTTP или любым другим пользовательским транспортом.