Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269

Завершить метод раньше задержки

08.04.2019, 16:05. Показов 3784. Ответов 44
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я хотел бы, чтобы если ответ пришел быстрее из _parent._serverClient.RestartCamera(); то продолжить работу дальше по методу, в этой части метода мы дожидаемся получения ответа от сервера которым занимается RestartCamera(), но ему может не всегда хватать 500мс, есть какой-то вариант условно поставить 5000 мс, но если он отработал за 100мс, не стал бы дожидаться конца и продолжил работу дальше?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
object balanceLock = new object();
 
                lock (balanceLock)
                {
                    bool timeout = false;
 
                    while (true)
                    {
                        if (timeout)
                            throw new Exception("Нет ответа от сервера.");
 
                        CancellationTokenSource cts = new CancellationTokenSource();
                        var token = cts.Token;
 
                        //Task.Run(() =>
                        //{
                          _parent._serverClient.RestartCamera();
                          Thread.Sleep(500);
                          timeout = true;
                        //}, token);
 
                        if (cts != null && !cts.IsCancellationRequested)
                            cts.Cancel();
                        break;
                    }
                }
Может сделать туда флаг, который бы контролировал получение ответа в цикле, если правда, то выйти не дожидаясь задержки
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.04.2019, 16:05
Ответы с готовыми решениями:

Cs go противник видит меня раньше/задержки в стрельбе
Всем привет, суть проблемы такая, начинаю стрелять в противника и визуально видно что пули долетают, но примерно через 0,5сек после начала...

Как завершить выполнение процедуры раньше времени?
Внутри процедуры, при выполнении определенного условия нужно вывести сообщение и остановить выполнение процедуры. Как вывести сообщение я...

Завершить работу потоков раньше окончания метода main()
Здравствуйте! Мне необходимо, чтобы потоки завершили свою работу раньше окончания метода main(). Нашла для с# что-то: thread.join() -...

44
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
09.04.2019, 10:20  [ТС]
Студворк — интернет-сервис помощи студентам
Usaga, спасибо) Но я не понимаю, чисто такого метода нет, есть параметризированным указателем типа <TResult>, и когда я делаю к примеру
C#
1
2
Task restart = Task.Run(() =>  _parent._serverClient.RestartCamera());
Task i = restart.Result;
то ругается на Result

Добавлено через 3 минуты
Usaga, я почему-то подумал на
C#
1
bool i = restart.IsCompleted;
и использую этот флаг в своих целях)

Добавлено через 1 минуту
(пока на тестах даёт то, что надо)) )

Добавлено через 16 минут
Usaga, да, всё таки не правильно, должно быть ожидание метода
C#
1
Task restart = Task.Run(() => _parent._serverClient.RestartCamera());
0
Эксперт .NET
 Аватар для Usaga
14776 / 9550 / 1366
Регистрация: 21.01.2016
Сообщений: 36,010
09.04.2019, 10:23
ShmelVG, интересующее вас значение кто возвращает?
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
09.04.2019, 10:25  [ТС]
Usaga,
C#
1
_parent._serverClient.RestartCamera()
нужно дождаться окончания работы этого метода, чтобы после завершения присвоить значение в messageEcho
0
Эксперт .NET
 Аватар для Usaga
14776 / 9550 / 1366
Регистрация: 21.01.2016
Сообщений: 36,010
09.04.2019, 10:27
ShmelVG, ну так дожидайтесь. Только хрень уже вырисовывается. И таймаут вам надо и окончание таски, которая по таймауту не интересна становится.

Вы уж определитесь.
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
09.04.2019, 10:30  [ТС]
Usaga,
Цитата Сообщение от ShmelVG Посмотреть сообщение
нужно дождаться окончания работы этого метода, чтобы после завершения присвоить значение в messageEcho
мне нужно только это
0
Эксперт .NET
 Аватар для Usaga
14776 / 9550 / 1366
Регистрация: 21.01.2016
Сообщений: 36,010
09.04.2019, 10:32
ShmelVG, у вас УЖЕ это реализовано. Сразу после Task.WaitAny.

Добавлено через 1 минуту
Только кто задаёт значение вашей переменной messageEcho в коде не особо видно. Видимо никто.
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
09.04.2019, 10:42  [ТС]
Usaga, "Task.WaitAny" не подходит, мы подписываемся на событие, в методе RestartCamera() получаем значение от сервера вызывая событие и должны дождаться окончания работы метода, чтобы успело присвоить значение переменной messageEcho, если мы не будем ждать, то не успеет присвоить значение
0
Эксперт .NET
 Аватар для Usaga
14776 / 9550 / 1366
Регистрация: 21.01.2016
Сообщений: 36,010
09.04.2019, 10:48
ShmelVG, Task.WaitAny вернёт управление, когда отработает или таска таймаута или вызывающая RestartCamera. Кто именно сработал раньше, вы можете проверить уже известным образом.

C#
1
2
3
4
5
6
var completedTask = Task.WaitAny(restart, delay);
 
if (completedTask == 0)
{
   // В этом месте restart уже закончила работу
}
Добавлено через 57 секунд
Если к моменту отработки кода выше, какое-то значение у вас куда-то не записалось, то берите в руки отладчик и смотрите, что делает ваш говнокод.
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
09.04.2019, 11:10  [ТС]
Usaga, при отладке
C#
1
2
3
4
5
var delay = Task.Delay(5000);
                var restart = Task.Run(() =>_parent._serverClient.RestartCamera());
                var completedTask = Task.WaitAny(restart, delay);
                
                if (completedTask == 0 || completedTask == 1)
я в роли сервера не посылаю ответ, и по времени он не ждёт 5 секунд!
0
Эксперт .NET
 Аватар для Usaga
14776 / 9550 / 1366
Регистрация: 21.01.2016
Сообщений: 36,010
09.04.2019, 11:21
ShmelVG, а сколько ждёт?
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
09.04.2019, 11:31  [ТС]
Usaga, у меня RestartCamera() всегда выполняется за определенное время +-, внутри его этот метод(в другом классе), метод перезапуска камеры

C#
1
2
3
4
5
6
7
8
9
10
11
public void RestartCamera()
        {
            try
            {
                _cameraTcpClient.Restart();
            }
            catch (Exception ex)
            {
                OnCameraError(new CameraErrorEventArgs("Ошибка перезапуска камеры", ex));
            }
        }
далее сам метод рестарт который посылает время серверу и само Эхо, где формируется время и отправляется сообщение серверу
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public void Restart()
        {
            bool isStopped = Stop();
 
            if (isStopped)
                Echo();
        }
 
        public void Echo()
        {
            SetId();
            SendMessage("echo " + Id);
        }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// отправка сообщений
        private void SendMessage(string command)
        {
            Start();
 
            _command = command;
 
            _message = "";
 
            if (_stream == null || HasConnect != true) return;
 
            byte[] data = Encoding.ASCII.GetBytes(command);
            _stream.Write(data, 0, data.Length);
        }
старт камеры
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
private void Start()
        {
            bool isNewClient = _client == null || _client.Client == null || !_client.Connected;
            
            if (isNewClient)
            {
                if (_client != null)
                {
                    Dispose();
                }
 
                _client = new TcpClient();
 
                try
                {
                    _cancellationTokenSource = new CancellationTokenSource();
                    _client.Connect(Host, Port);
                    _stream = _client.GetStream();
 
                    _receiveTask = Task.Run(() => ReceiveMessage(_cancellationTokenSource.Token), _cancellationTokenSource.Token);
                }
                catch (Exception ex)
                {
                    OnError("Ошибка запуска клиента камеры.", ex);
                }
                finally
                {
                    HasConnect = (_client != null && _client.Client != null) ? _client.Connected : false;
 
                    if (HasConnect == true)
                        OnConnect(isNewClient);
                }
            }
        }
в другом потоке получаем и разбираем ответ
C#
1
_receiveTask = Task.Run(() => ReceiveMessage(_cancellationTokenSource.Token), _cancellationTokenSource.Token);
Добавлено через 2 минуты
Я точно понял что задержку надо ставить где-то внутри RestartCamera()

Добавлено через 1 минуту
без задержки у меня не успевает срабатывать событие
0
Эксперт .NET
 Аватар для Usaga
14776 / 9550 / 1366
Регистрация: 21.01.2016
Сообщений: 36,010
09.04.2019, 11:39
ShmelVG, Значит ваш метод отрабатывает быстрее таймаута. Может быть по причине ошибки какой-то.

Чудес не бывает. Берите в руки отладчик и смотрите поэтапно, что у вас в коде происходит.
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
09.04.2019, 15:53  [ТС]
Господи, надо было всего лишь сделать так:
C#
1
2
3
4
5
6
7
8
_parent._serverClient.RestartCamera();
 
                var dt = DateTime.Now;
 
                while (string.IsNullOrEmpty(messageEcho) && (DateTime.Now-dt).TotalSeconds < 30)
                {
                    Thread.Sleep(10);
                }
0
Эксперт .NET
 Аватар для Usaga
14776 / 9550 / 1366
Регистрация: 21.01.2016
Сообщений: 36,010
10.04.2019, 06:35
ShmelVG, фееричный дерьмокод. Уж не обижайтесь, в ситуации, когда было показано как правильно, это - заслуженная оценка.
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
10.04.2019, 09:01  [ТС]
Usaga, да, согласен, костыльный метод, пытаюсь сделать что-то типа такого

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public delegate void EchoSentEventHandler(object sender, ReceivedEchoEventArgs e);
ReceivedEchoEventArgs WaitForMessageSent()
        {
            ReceivedEchoEventArgs result = null;
            EchoSentEventHandler handler;
 
            using (var mre = new ManualResetEvent(true))
            {
                handler = (o, e) => 
                {
                    _parent._serverClient.ReceivedEcho -= GetMessageEcho;
                    result = e;
                    //try { mre.Signal(); } catch (ObjectDisposedException) { }
                };
                _parent._serverClient.ReceivedEcho += GetMessageEcho;
                mre.WaitOne();
                return result;
            }
        }
но у ManualResetEvent не вижу метода Signal(), из-за этого не могу подать сигнал((
0
Эксперт .NET
 Аватар для Usaga
14776 / 9550 / 1366
Регистрация: 21.01.2016
Сообщений: 36,010
10.04.2019, 09:18
ShmelVG, вы создали ManualResetEvent и в месте, где его создали, теперь ждёте, что он сработает? А кто его "пнёт", чтобы WaitOne() вам управление вернул?

Добавлено через 2 минуты
Цитата Сообщение от ShmelVG Посмотреть сообщение
не вижу метода Signal(), из-за этого не могу подать сигнал((
А документацию на этот класс вы открывать не пробовали? Это не так интересно, как методом тыка работать? Там методов - кот наплакал. В глаза сразу бросается некий Set().
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
10.04.2019, 09:50  [ТС]
Usaga, сделал чуть иначе, в методе IsCameraRestarted(string ip, int port)
я организовал так
C#
1
2
3
4
5
6
7
8
9
10
var signal = new ManualResetEvent(false);
                new Thread(() =>
                {
                    _parent._serverClient.ReceivedEcho -= GetMessageEcho;
                    signal.WaitOne();
                    signal.Dispose();
                }).Start();
                _parent._serverClient.ReceivedEcho += GetMessageEcho;
                signal.Set();                
                signal.Reset();
Это выполняется в try/catch
Но это очень странно, когда после срабатывания метода signal.Reset();
я вылетаю в exception блока catch

Добавлено через 9 минут
вылетает на signal.Set();
0
Эксперт .NET
 Аватар для Usaga
14776 / 9550 / 1366
Регистрация: 21.01.2016
Сообщений: 36,010
10.04.2019, 10:14
Цитата Сообщение от ShmelVG Посмотреть сообщение
я вылетаю в exception блока catch
Вы могли бы почитать сообщение об ошибке, что находится в этом исключении. Там бы вам сказали, что ваш ManualResetEvent был переведён в высвобожденное состояние вызовом signal.Dispose();, который срабатывает сразу после того, как вы выдали сигнал.

Добавлено через 1 минуту
ShmelVG, ох и долго вы будете своим методом тыка программу писать.
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
10.04.2019, 10:37  [ТС]
Usaga, Да( Я впервые с этим столкнулся...вы знаете решение?
0
Эксперт .NET
 Аватар для Usaga
14776 / 9550 / 1366
Регистрация: 21.01.2016
Сообщений: 36,010
10.04.2019, 10:42
ShmelVG, не диспозить в потоке то, что потоку не принадлежит.

И почему Thread используется, который устарел лет восемь назад? Вам уже подсказывали, что есть Task.

Я вам предлагаю остановиться ненадолго и почитать внимательно документацию и примеры использования вещей, которые вы пытаетесь использовать в своём коде. Я вам предлагаю в любой непонятной ситуации:
* Смотреть описание класса в самой студии (F12);
* Смотреть документацию на класс на MSDN;
* Не забывать, что в получаемых исключениях есть человекочитиаемое описание ошибки;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.04.2019, 10:42

СЛАУ. Метод обратной матрицы, метод Гаусса, метод Крамера, метод Зейделя
Помогите ребят. Не могу построить алгоритмы для этих методов Язык C++

Задержки
Всем добрый вечер! Недавно начал изучать WPF, и сейчас возникла одна проблема. Есть массив из Rectangle, нужно изменить в цикле Opacity...

Реализация задержки
Нужно вызвать задержку выполнения программы....Программа WPF. Thread.Sleep(300); //Вызывает зависание

Алгоритм задержки
Добрый вечер. Хочу попробовать динамически выводить текст в консоли. Какой алгоритм создания задержки? Не через функцию Sleep().

Задержки в таймере
например, таймер у меня опрашивает каждую секунду выполнение одного условия. Можно сделать так чтобы при выполнении этого условия сделать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru