powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Отменить выполнение метода по таймауту
4 сообщений из 4, страница 1 из 1
Отменить выполнение метода по таймауту
    #38986625
monstrilla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос больше по чистому шарпу, но топик не нашел. Примем во-внимание, что метод TestConnectMethod запускается по клику на WPF-форме.

Код: 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.
private void TestConnectMethod()
        {
            int QueryTimeOut = 1000; //in ms
            
            _txtError.Visibility = Visibility.Hidden;

            var cancellationTokenSource = new CancellationTokenSource();
            var token = cancellationTokenSource.Token;

            var task = Task.Factory.StartNew(() =>
            {
     
                ArchiveServiceClient.Instance.Authenticate(//список параметров, не суть);
            }, token).ContinueWith(t =>
            {
                // тут еще какой-то код, тоже не суть
            });

            var wres = task.Wait(QueryTimeOut);

            if (!wres)
            {
                cancellationTokenSource.Cancel();
                _txtError.Text = "Превышен интервал ожидания для запроса";
            }
            else
            {
                _txtError.Text = "Все ОК";
            }
        }



Суть такова. Внутри метода TestConnectMethod вызывается метод сервера Authenticate. Если сервер не доступен или с ним еще какие-то проблемы программа виснет на его вызове. Хочется, чтобы через какое-то время (например, через QueryTimeOut мсек) выполнение метода останавливалось. Погуглил, попробовал трюк с Task-om и Wait-om, но задачу отменить нельзя, некуда писать

Код: c#
1.
2.
if (token.IsCancellationRequested)
    token.ThrowIfCancellationRequested();



потому что выполнение висит на методе Authenticate. Получается, что по таймауту задача так и продолжает "выполняться", т.е. выполнение так и висит на методе Authenticate.

Реально ли сделать то, что я хочу?
...
Рейтинг: 0 / 0
Отменить выполнение метода по таймауту
    #38987103
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monstrilla,

если я правильно понял, нужно задать
Код: c#
1.
cancellationTokenSource.CancelAfter(timeout);


а также нужно передавать этот же token в продолжение:
Код: c#
1.
2.
3.
4.
.ContinueWith(t =>
{
    // тут еще какой-то код, тоже не суть
}, token);


тогда продолжение не будет вызываться при превышении таймаута. Но таска с вызовом метода Authenticate отработает в любом случае, если в нём самом не предусмотрено прерывание работы по таймауту.
...
Рейтинг: 0 / 0
Отменить выполнение метода по таймауту
    #38987209
monstrilla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
petalvik,

надо чтоб именно таска отвалилась по таймауту. буржуи пишут, что так нельзя сделать в принципе. :( если уже вызвал метод, то заканселить не получится.
...
Рейтинг: 0 / 0
Отменить выполнение метода по таймауту
    #38987325
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нормальные сервисы уже имеют таймауты.
как я понимаю, выход только 1.
создавать поток, в потоке запускать нужный метод. Ожидать завершение поток N секунд и убивать его, если он не завершился.
предварительно лучше попытаться завершить.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Отменить выполнение метода по таймауту
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]