@daniil14056

C# Как задержать время потока или заупстить функцию Task через Наносекунды а то и меньше?

Задача, вот такой код примерно ща натряпал
bool isFirst=true;
        /// Приходит значения на порты асинхронно, или еще хз.., запустить функцию обработки значений на них,
        /// Значение может прийти на 1 порт, или на оба, если на оба, то нужно только 1 раз их обработать 
        /// их свежие значения. 
        public void OnChangePort(Port p,int index)
        {
            if (index == 0)
            {
                Port1.SetValue(p.GetValue());
            }
            else
            {
                Port2.SetValue(p.GetValue());
            }
            if (isFirst) // если еще не была запущенна функция Propagate(которая может запускаться только по  частоте.
            {
                long tiks = 3; // ; 
                ///????? Как здаержать на число тактов или ПикоСекунд.
                System.Threading.Thread.Sleep((tiks)); /// ждем пока прийдет значение на второй порт через пару тактов
                /// елси не пришло   то и фиг с ним. 
                Propagate(); // выполнить работу с портами(как бы работает по частоте типа 3ГигаГерцю
            } 
               

        }
        public void Propagate()
        {
            Work(Port1.GetValue(), Port2.GetValue(), Operation); // выполнить операцию
            isFirst = true;  /// разрешить дальше  обрабатывать значения
        }

  • Вопрос задан
  • 85 просмотров
Решения вопроса 1
freeExec
@freeExec
Участник OpenStreetMap
///????? Как здаержать на число тактов или ПикоСекунд.

Винда - это не операционка реального времени. Вы не можете регулировать тики. Не разу не сталкивался с подвисшими приложениями? Управление могут вернуть и через минуту, даже если ты заказывал совсем чуть-чуть.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
vabka
@vabka Куратор тега C#
Токсичный шарпист
Нельзя. При работе с сетью используйте асинхронный подход и таймауты. Наносекунды - это задержки на уровне шины ОЗУ, а не на уровне сети. Оно работать не будет.
Ответ написан
Комментировать
@soloveid
Самое маленькое на сколько сможете задержать 15мс.
На серверных машинах это значение ещё больше.
Эти ограничения введены потому, что переключение выполнения между потоками не мгновенная операция.
Можно конечно чтобы все Ваши потоки делали Thread.Yeild() и они будут отдавать своё время другим потокам,
но скорее всего Вашему потоку это не поможет.

В дополнение по самой задаче и коду:
- обычно из потоков считывают и складывают куда-то, а потом поток-молотилка обрабатывает значения, так вы сможете разделить Вашу логику, а не писать всё приложение в коде приёма данных из сокетов.
- ваша переменная isFirst не будет отвечать ожиданиям, если вы работаете с потоками, то так работать с shared-переменными нельзя.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы