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

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

08.04.2019, 16:05. Показов 3485. Ответов 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
 Аватар для Immo
692 / 509 / 238
Регистрация: 02.10.2012
Сообщений: 1,741
08.04.2019, 16:17
сделать метод ответа например isAnswered, и если тру то выходить из цикла? А так в любом случае выносить в отдельный поток, что бы не останавливать основной, и если например isAnswered фолс, в течение n секунд, то кидать ошибку о таймауте.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
08.04.2019, 16:30
Цитата Сообщение от ShmelVG Посмотреть сообщение
есть какой-то вариант условно поставить 5000 мс, но если он отработал за 100мс, не стал бы дожидаться конца и продолжил работу дальше?
C#
1
2
3
4
5
6
7
var delay = Task.Delay(5000);
var restart = Task.Run(_parent._serverClient.RestartCamera);
var completedTask = Task.WaitAny(restart, delay);
if (completedTask == 1)
{
  // Таймаут
}
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
08.04.2019, 16:43  [ТС]
kolorotur, в моем случае ругается на Run (Неоднозначный вызов следующих методов или свойств: 'Task.Run(Action)" и "Task.Run(Func<Task>)")
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
08.04.2019, 17:06
Цитата Сообщение от ShmelVG Посмотреть сообщение
ругается на Run
C#
1
Task.Run(() => _parent._serverClient.RestartCamera());
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
08.04.2019, 17:07  [ТС]
kolorotur, сделал так
C#
1
var restart = Task.Run(() =>_parent._serverClient.RestartCamera());
А что ты подразумевали под // Таймаут ?

Добавлено через 56 секунд
Одновременно получилось)
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
08.04.2019, 17:08
Цитата Сообщение от ShmelVG Посмотреть сообщение
А что ты подразумевали под // Таймаут ?
Если выполнение зашло в фигурные скобки после условия — туда, где комментарий, то 5000мс прошли быстрее, чем закончил работу метод RestartCamera.
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
08.04.2019, 17:16  [ТС]
kolorotur,
C#
1
if (completedTask == 1)
я не очень понял условие, если ожидание равно 1 мс? Т.е. в тело if идет моё продолжение кода?

Добавлено через 5 минут
Не могу понять как работает, чаще приходит 0, чем 1
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
08.04.2019, 17:18
Цитата Сообщение от ShmelVG Посмотреть сообщение
если ожидание равно 1 мс?
Нет, если первой завершилась задача, переданная в метод WaitAny под индексом 1, то есть вторая, то есть delay.

Цитата Сообщение от ShmelVG Посмотреть сообщение
чаще приходит 0, чем 1
Значит метод RestartCamera успевает отработать быстрее, чем за 5 секунд.
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
08.04.2019, 17:21  [ТС]
kolorotur, я могу сделать так?
var delay = Task.Delay(30000);

и if (completedTask == 0) где внутри тела будет продолжение метода, а если (else) ==1 то генерить исключение (значит нет ответа от сервера)
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
08.04.2019, 17:24
Цитата Сообщение от ShmelVG Посмотреть сообщение
я могу сделать так?
Ну попробуйте
Если работает, то конечно можете, а если третья мировая начнется, то где-то скорее всего опечатку сделали.
1
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
08.04.2019, 17:58  [ТС]
kolorotur, в общем я залес в дебри( как можно дождаться выполнения события
C#
1
2
3
4
5
6
7
8
9
10
11
12
private void GetMessageEcho(object sender, ReceivedEchoEventArgs e)
        {
            messageEcho = e.Message;
 
            if (string.IsNullOrWhiteSpace(messageEcho))
            {
                _parent._serverClient.CameraHasConnect = false;
                throw new Exception("my ex");
            }
            else
                _parent._serverClient.CameraHasConnect = true;
        }
что бы моя переменная messageEcho успела получить значение от сервера

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
private string messageEcho;
        private bool IsCameraRestarted(string ip, int port)
        {
            bool result = false;
 
            try
            {
                _parent._serverClient._cameraTcpClient.Host = ip;
                _parent._serverClient._cameraTcpClient.Port = port;
 
                _cameraHasChanged = true;
 
                //_parent._serverClient.ReceivedEcho += (s, a) => Debug.Print("Результат события ReceivedEcho: " + messageEcho);
                _parent._serverClient.ReceivedEcho -= GetMessageEcho;
                _parent._serverClient.ReceivedEcho += GetMessageEcho;
 
                object locker = new object();
 
                lock (locker)
                {
                    var delay = Task.Delay(15000);
                    var restart = Task.Run(() => _parent._serverClient.RestartCamera());
                    var completedTask = Task.WaitAny(restart, delay);
 
                    if (completedTask == 0)
                    {
                        if (string.IsNullOrWhiteSpace(messageEcho))
                        {
                            result = _parent._serverClient.CameraHasConnect == false;
                            throw new Exception("Не верный формат ответа echo от сервера.");
                        }
                        else
                            result = _parent._serverClient.CameraHasConnect == true;
 
                        if (result)
                            _parent._log.Write("Удаленная служба камер переподключена.");
                        else
                            _parent._log.Write("Ошибка переподключения к удаленной службе камер.");
                    }
                    else
                    {
                        _parent._serverClient.CameraHasConnect = false;
                        throw new Exception("Нет ответа echo от сервера.");
                    }
                    messageEcho = "";
                }
                //result = _parent._serverClient.CameraHasConnect == true;                
            }
            catch (Exception ex)
            {
                _parent._log.Write("Ошибка переподключения к удаленной службе камер.", ex);
                result = false;
            }
            finally
            {
                CameraConnectState = _parent._serverClient.CameraHasConnect;
                _cameraRestarted = true;
            }
            return result;
        }
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
09.04.2019, 08:45  [ТС]
апну, может кто знает
0
Эксперт .NET
 Аватар для Usaga
14289 / 9375 / 1351
Регистрация: 21.01.2016
Сообщений: 35,330
09.04.2019, 09:01
ShmelVG, и что у вас тут не получается?
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
09.04.2019, 09:09  [ТС]
Usaga, я не очень понимаю как организовать работу, у меня в одном классе есть событие GetMessageEcho работает правильно (получает нужный рез от сервера), а в методе IsCameraRestarted дало сделать задержку отработки т.е. после RestartCamera, иначе переменная messageEcho не успевает получить данные от сервера, но на прямую делать задержку плохая примета, я не хочу чтобы человек всегда ждал 5 секунд, надо дождаться отработки события, вы знаете как можно это сделать?
0
Эксперт .NET
 Аватар для Usaga
14289 / 9375 / 1351
Регистрация: 21.01.2016
Сообщений: 35,330
09.04.2019, 09:10
ShmelVG, у таски (restart) можно запросить результат работы этой таски. Надеюсь догадаетесь, где и как это посмотреть можно?
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
09.04.2019, 09:14  [ТС]
Usaga, нет Можно как для младенцев пожалуйста
0
Эксперт .NET
 Аватар для Usaga
14289 / 9375 / 1351
Регистрация: 21.01.2016
Сообщений: 35,330
09.04.2019, 09:17
ShmelVG, а вы напрягитесь, тут большого ума не надо. Тем более, что в первом из двух предложений я уже назвал. Такое-то вы можете?
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
09.04.2019, 09:19  [ТС]
Usaga, я вижу решение сделать через async/await
0
Эксперт .NET
 Аватар для Usaga
14289 / 9375 / 1351
Регистрация: 21.01.2016
Сообщений: 35,330
09.04.2019, 09:37
ShmelVG, а можно было просто поставить курсор на слово Task, нажать F12 и посмотреть на список методов и свойств класса Task. Вдруг там найдётся что-то такое по названию чего будет понятно, что это то, что вам надо.

Но раз вам сложно нажать кнопку, то переделывайте через async/await.

Добавлено через 14 минут
Речь шла об этом свойстве: Task<T>.Result.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.04.2019, 09:37
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru