|
13 / 11 / 2
Регистрация: 07.05.2015
Сообщений: 418
|
|
Выполнить только последнюю вызванную функцию12.04.2022, 06:53. Показов 2188. Ответов 32
Метки нет (Все метки)
У меня есть асинхронная функция FooAsync(object current), которая выполняет большую работу по обработке аргумента. Я хочу, чтобы пользователь мог запустив второй раз эту функцию прервать выполнение предыдущей задачи и начать заново с другим аргументом асинхронно. Как это можно сделать? Я пытался это осуществить с помощью статического CancellationToken в классе, где лежит функция FooAsync, но это не сработало (
0
|
|
| 12.04.2022, 06:53 | |
|
Ответы с готовыми решениями:
32
Как только один раз выполнить функцию в данном проекте? Как дождаться полного выполнения функции и только тогда выполнить другую функцию?
|
|
Модератор
|
||||||||||||
| 14.04.2022, 13:49 | ||||||||||||
|
Но зачем вам токен в параметрах передавать? У вас же был статический семафор - его эквивалентом (в этом случае) будет lock со статическим локером. Может. В моём примере нет лага между получением токена и выходом из синхронизации. В принципе тоже самое можно сделать и в вашем коде, но сам семафор в нём не пойму зачем нужен и ветка исключения запустит задачу с не пойми каким токеном:
Aycon, может вы подобное имели ввиду:
Aycon, то есть, если у вас есть try, то как-то надо обрабатывать и catch - иначе какой в нём смысл? Но я не пойма, что в вашем коде работы с _cancellSource может создать исключение? Для чего вы, вообще try поставили? Только если _cancellSource будет null, но по логике вашей реализации - это невозможная ситуация. Добавлено через 5 минут Ну, разве что между Dispose() и созданием нового, другой поток вызовет Cancel();.Хотя это вероятность 1 на триллион или даже менее. Но в этом случае вы получите результат противоположный нужному вам. Метод вызывающий Cancel(); и поймавший исключение, начинает свою работу позже вызывающего Dispose().И, следовательно, у вас "отвалится" метод с актуальными данными, а не с устаревшими. Добавлено через 2 минуты По факту из вашего кода можно полностью удалить try и ничего не изменится.
0
|
||||||||||||
|
13 / 11 / 2
Регистрация: 07.05.2015
Сообщений: 418
|
|
| 14.04.2022, 13:50 [ТС] | |
|
Элд Хасп, да, я бы хотел чтобы я так написал и оно так и работало, но в этом случае второй вызов функции будет ожидать завершения первого вызова (ненужные 10 минут обработки неактуального объекта) а потом ещё 10 мин будет считать сама.
Добавлено через 32 секунды Элд Хасп, и я не понимаю о каком лаге вы говорите. Что за лаг?
0
|
|
|
13 / 11 / 2
Регистрация: 07.05.2015
Сообщений: 418
|
||
| 14.04.2022, 13:53 [ТС] | ||
|
Элд Хасп,
0
|
||
|
Модератор
|
|||
| 14.04.2022, 13:57 | |||
Cancel(); и Dispose().Что ещё может вызвать исключение в вашем коде - я не знаю. Вы же для чего то же ставили try - больше ни для чего он там не может быть нужен. Добавлено через 1 минуту await _semaphore.WaitAsync(token);.А у вас эта строка не охвачена try.
1
|
|||
|
13 / 11 / 2
Регистрация: 07.05.2015
Сообщений: 418
|
||
| 14.04.2022, 14:18 [ТС] | ||
|
Элд Хасп, Зачем? Чтобы что, остановить func тогда как я хотел остановить ConvertToLastCallAsync? Кроме того, это запах кода. Лишняя нагрузка на процессор, лучше уж использовать CancellationTokenSource.CreateLinkedToTo kenSource, если это нужно. Я специально стараюсь написать архитектуру без опроса по таймеру и ожидания. В Delay опрос по таймеру просто неизбежен.
Добавлено через 8 минут Элд Хасп,
Добавлено через 6 минут Элд Хасп, а с чем связан лаг? У меня нет задержки Добавлено через 3 минуты Элд Хасп, аа, релиз.... я не обратил внимание. Так действительно быстрее
0
|
||
|
Модератор
|
||||
| 14.04.2022, 14:27 | ||||
|
На какой строке в нём, по вашему мнению, может произойти исключение? Либо периодической "ручной" проверкой токена в методе выполняемом задачей. Других вариантов нет. Для исключения коллизий при отмене токена и его пересоздании (очень маловероятных, но всё же), блок кода который это делает должен быть синхронизирован. Что тут делает семафор..... Мне даже в голову не приходит. Он ограничивает количество потоков. А вам нужно синхронизация работы с токеном. Одно с другим, на мой взгляд, вообще, никак не связано.
0
|
||||
|
13 / 11 / 2
Регистрация: 07.05.2015
Сообщений: 418
|
|
| 14.04.2022, 14:41 [ТС] | |
|
Элд Хасп, хочу поведение как на нижней половине картинки. Только вместо потоков контексты синхронизации и чтобы это было потокобезопасно и чтобы вызываемая функция была асинхронной и чтобы она сама себя прерывала, либо её обёртка как в моём случае. И чтобы без блокирующих ожиданий и чтобы без опросов по таймеру. (Это ужасно, ну правда, есть же коллбеки, токен отмены, observer в конце концов).
0
|
|
|
Модератор
|
||||||
| 14.04.2022, 18:35 | ||||||
Сообщение было отмечено Aycon как решение
РешениеКак это? Контекст синхронизации связан с конкретным потоком. Не бывает Контекста синхронизации без потока. Только если всё делать в одном потоке. А так зависит от используемых объектов и способов работы с ним. Если async-await, то она будет выполняться на пуле потоков. Но вы пишите за Контексты синхронизации..... У меня в голове не складывается понимание того, что вы хотите сделать. Можно прервать поток в котором выполняется задача (Thread.Abort()), но это плохая идея. С возможными потенциальными багами и влиянием на другие задачи. В вашем случае я не понимаю почему вы считает, что достигли такого результат. Обёртка здесь точно не причём. Или задача func в своём теле имеет блок проверки условий и отмены себя, или никто начавшую исполняться задачу не отменит.По другому обеспечить потокобезопасность объекта невозможно. Пока один метод с ним работает, другой не может с ним работать. Если это сделано на локерах, то исполняющая и ожидающие задачи могут быть из разных потоков. Если вы запускаете все задачи через Контекст синхронизации в одном потоке, то локеры не нужны, но это не значит что не будет ожидания. Просто все методы будет выполнять один поток. И пока текущий метод выполняется - остальные ждут в очереди задач этого потока (веренее Контекста синхронизации).
1
|
||||||
|
Модератор
|
||
| 15.04.2022, 14:42 | ||
|
Aycon, может небольшую долю неясности для вас внесло то, что вы эмулировали реальный метод с помощью Task.Delay(...):
Такой метод на время своего исполнения не освобождает поток, а Task.Delay - освобождает. Поэтому правильно эмулировать длительный метод будет методом Thread.Sleep(...).
0
|
||
|
13 / 11 / 2
Регистрация: 07.05.2015
Сообщений: 418
|
|
| 15.04.2022, 14:46 [ТС] | |
|
Элд Хасп, в этом то и дело, что метод Должен освобождать поток. Те обработка происходит в другом потоке, чтобы не занимать ui
0
|
|
|
Модератор
|
|||||||
| 15.04.2022, 15:00 | |||||||
|
Вызывавший поток будет освобождён в любом случае, но с Delay() будет освобождаться и исполняющий поток, что не верно сточки зрения эмуляции длительного метода. Не забывайте сам по себе длительный вычислительный метод является синхронным. Никакой асинхронности в нём нет. Асинхронность появляется тогда когда его заворачивают в задачу. А Delay, в принципе, не может быть синхронным, поэтому он не может верно эмулировать длительный вычислительный метод. Добавлено через 4 минуты
0
|
|||||||
|
13 / 11 / 2
Регистрация: 07.05.2015
Сообщений: 418
|
|
| 16.04.2022, 16:54 [ТС] | |
|
Элд Хасп, спасибо, буду иметь в виду
0
|
|
| 16.04.2022, 16:54 | |
|
Выполнить последнюю фигуру, зная как формируется начальная Как использовать переменную php вызванную Ajax-ом? Добавление своего текста в форму вызванную из Iframe Как исправить ошибку загрузочного сектора вызванную вирусом открывает только последнюю страницу Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2.
Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
|
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её.
Всё это стресс конечно. Почему?. . .
|
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот.
Ларри Уингет
|
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
|
|
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров
В текущей версии модели успешно реализован ключевой механизм. . .
|
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям
Реализованные компоненты:
Механизм закисления почвы через протонную помпу
Конкуренция между типами микориз
pH как триггер сукцессии
C/ P соотношение. . .
|
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
|
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
|