Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.81/68: Рейтинг темы: голосов - 68, средняя оценка - 4.81
 Аватар для stels009
16 / 15 / 1
Регистрация: 05.04.2011
Сообщений: 426

Ограничение времени на выполнение функции

02.08.2015, 19:20. Показов 13695. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток.
У меня есть примитивная функция типа
C#
1
2
3
4
5
6
int i = 0;
while(true)
{
    ++i;
    log(i);
}
Так вот мне нужно чтобы данная функция выполнялась не более 2000мс по истечению этого времени нужно сломать цикл break; и нужно учесть то, что данная функция запускается асинхронно в 100а потоках.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.08.2015, 19:20
Ответы с готовыми решениями:

Выполнение функции при наступлении определенного момента времени
Здравствуйте! Появилась задача выполнения каких либо операций при наступлении определенного момента времени, например наступление каждого...

в консоле ввод даты и времени,и при совпадении выполнение функции
Как осуществить?

Ограничение работы функции по времени
Как сделать ограничение по времени? Например если функция выполняется больше 15 секунд то вывести на экран "функция не работает",...

30
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
02.08.2015, 19:35
Цитата Сообщение от stels009 Посмотреть сообщение
чтобы данная функция выполнялась не более 2000мс
Так пойдет?
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using System.Threading;
 
namespace ConsoleApplication1 {
    class Program {
        static void Main(string[] args) {
            new Thread(Method).Start();
            Console.ReadLine();
        }
        static void Method() {
            DateTime startTime = DateTime.Now;
            while (true) {
                //Тут ваш код.....
                if (DateTime.Now.Subtract(startTime) >= new TimeSpan(0,0,0,0,2000)) {
                    break;
                }
            }
            Console.WriteLine("Completed!");
        }
    }
}
1
 Аватар для stels009
16 / 15 / 1
Регистрация: 05.04.2011
Сообщений: 426
02.08.2015, 19:44  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
Так пойдет?
Если честно то не совсем
Предположим такая ситуация:
C#
1
2
3
4
5
            while (true) {
                funk();//<< Тут задержка 3000мс
                if (DateTime.Now.Subtract(startTime) >= new TimeSpan(0,0,0,0,2000)) {
                    break;
                }
Тогда условие на проверку не сработает.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
02.08.2015, 19:51
Цитата Сообщение от stels009 Посмотреть сообщение
Тогда условие на проверку не сработает.
Оно сработает. Сразу после завершения вашего метода произойдет выход из цикла. А уж от вас зависит, сколько будет выполняться этот метод.
0
 Аватар для stels009
16 / 15 / 1
Регистрация: 05.04.2011
Сообщений: 426
02.08.2015, 20:06  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
А уж от вас зависит, сколько будет выполняться этот метод.
Вот мне как раз таки нужно ограничить время на выполнение метода, как я предполагаю еще можно каждому потоку создать еще 1 поток в котором будет проверяться время затраченное на выполнение, в случае превышения тормозить процесс

Добавлено через 2 минуты
Вот есть та самая funk(); которую нужно ограничить
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        public static bool cheker(string address)
        {
            try
            {
                string[] ttr = new string[2];
                ttr = address.Split(':');
                WebProxy ss = new WebProxy();
                string host = ttr[0];
                int port = Convert.ToInt32(ttr[1]);
 
                WebClient wc = new WebClient();
                wc.Proxy = new WebProxy(host, port);
                wc.DownloadString("http://google.com/ncr");
                StreamWriter swe = new StreamWriter("UProxy.txt", true);
                swe.WriteLine(address);
                swe.Close();
                return true;
            }
            catch { return false; }
        }
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
02.08.2015, 20:09
stels009, почему бы не делать так как следует - проверять все внутри этого метода? А то у вас поток на потоке сидит и потоком погоняет... А если их, как вы сказали, 100, то это вообще жесть..
Поймите, пока ваш метод в цикле не завершит работу и не вернет управление вызывающему коду, выполнение не пойдет дальше и никакие проверки не сработают.
0
Заблокирован
02.08.2015, 21:49
stels009, возможно подойдет:
Monitor.TryEnter:
https://msdn.microsoft.com/en-... .110).aspx
0
Кодогенератор
 Аватар для hepper
200 / 200 / 51
Регистрация: 15.06.2011
Сообщений: 794
02.08.2015, 22:10
stels009, оно?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
            var swatch = new Stopwatch();
            swatch.Start();
            var task = new Thread(() =>
                                   {
                                       func();
                                   });
            task.Start();
            while (task.IsAlive)
            {
                if (swatch.ElapsedMilliseconds > 2000) { task.Abort(); }
                Thread.Sleep(50);
            }
            swatch.Stop();
0
 Аватар для stels009
16 / 15 / 1
Регистрация: 05.04.2011
Сообщений: 426
03.08.2015, 12:18  [ТС]
Цитата Сообщение от hepper Посмотреть сообщение
C#
1
2
3
4
5
6
while (task.IsAlive)
{
if (swatch.ElapsedMilliseconds > 2000) { task.Abort(); }
Thread.Sleep(50);
}
swatch.Stop();
Никак не пойму как этот цикл использовать

Мне по сути нужно чтобы WebClient не ждал ответа от сервера более 2000мс
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
03.08.2015, 12:45
stels009,
ИМХО:
1) Прервать поток в котором работает сокет - невозможно. Abort не поможет, потому что Abort работает только тогда, когда поток находится в управляемом коде. Но сокет - это неуправляемый объект.
2) Работа сокета регулируется таймаутами. Можно порекомендовать вместо WebClient использовать более низкоуровневые объекты (HttpWebRequest или даже TcpClient) которые позволяют явно задать таймауты.
3) Но и таймауты не решат проблемы целиком, потому что система (то ли winapi, то ли фреймворк - точно не знаю) не позволяет задать таймаут на Connect. А именно на коннекте у вас наверно все и подвисает, если прокси - битая.
4) Т.о. резюмируя - я бы вообще не прерывал никакие потоки. Я бы во-первых вместо потоков использовал асинхронные сокеты (который явно не используют потоки). И во-вторых, если от сокета не получен ответ в течении некоторого промежутка времени - значит считать прокси битой. Сам же сокет можно просто забыть. Рано или поздно он сам убъется (когда таймаут конекта закончится).
0
 Аватар для stels009
16 / 15 / 1
Регистрация: 05.04.2011
Сообщений: 426
03.08.2015, 13:01  [ТС]
Цитата Сообщение от Storm23 Посмотреть сообщение
Я бы во-первых вместо потоков использовал асинхронные сокеты (который явно не используют потоки).
Можно маленький примерчик в виде кода?
0
 Аватар для LeniumSoft
1454 / 847 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
03.08.2015, 13:16
Цитата Сообщение от stels009 Посмотреть сообщение
Мне по сути нужно чтобы WebClient не ждал ответа от сервера более 2000мс
http://stackoverflow.com/quest... ent-object

Добавлено через 5 минут
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
public class WebDownload : WebClient
{
    /// <summary>
    /// Time in milliseconds
    /// </summary>
    public int Timeout { get; set; }
 
    public WebDownload() : this(60000) { }
 
    public WebDownload(int timeout)
    {
        this.Timeout = timeout;
    }
 
    protected override WebRequest GetWebRequest(Uri address)
    {
        var request = base.GetWebRequest(address);
        if (request != null)
        {
            request.Timeout = this.Timeout;
        }
        return request;
    }
}
 
 
//Использование
 
var downloader = new WebDownload(TimeSpan.FromSeconds(2).TotalMilliseconds);
//Дальше как с обычным WebClient
1
 Аватар для stels009
16 / 15 / 1
Регистрация: 05.04.2011
Сообщений: 426
03.08.2015, 14:32  [ТС]
LeniumSoft,
2 плюшки с эти вылезло
1. Перестало по факту чекать даже с периодом 60 000мс
2. Периодически процесс дергает проц
Миниатюры
Ограничение времени на выполнение функции  
0
 Аватар для stels009
16 / 15 / 1
Регистрация: 05.04.2011
Сообщений: 426
03.08.2015, 14:35  [ТС]
Кликните здесь для просмотра всего текста
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
        public bool cheker(string address)
        {
            try
            {
                string[] ttr = new string[2];
                ttr = address.Split(':');
                WebProxy ss = new WebProxy();
                string host = ttr[0];
                int port = Convert.ToInt32(ttr[1]);
 
                //WebClient wc = new WebClient();
                //wc.Proxy = new WebProxy(host, port);
 
                var downloader = new WebDownload(Convert.ToInt32(TimeSpan.FromSeconds(2).TotalMilliseconds));
                Perm.tteer = downloader.DownloadString("http://google.com/ncr");
                //Perm.tteer = wc.DownloadString("http://google.com/ncr");
                if (Regex.Replace(Perm.tteer, "(Google)", String.Empty) != "")
                {
                    StreamWriter swe = new StreamWriter("UProxy.txt", true);
                    swe.WriteLine(address + " " + Perm.tteer);
                    swe.Close();
                    return true;
                }
                else { return false; }
            }
            catch { return false; }
        }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        private void button2_Click(object sender, EventArgs e)
        {
            Control.CheckForIllegalCrossThreadCalls = true;
 
            for (int i = 0; i < potoki; i++)
            {
                ThreadPool.QueueUserWorkItem((a) =>
                {
                    chek();
                }); 
            }
            timer1.Start();
        }
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
        void chek()
        {
            while (true)
            {
                if (Perm.ProxyIndex <= Perm.ProxyValue)
                {
                    ++Perm.ProxyIndex;
                    if (cheker(Perm.proxySS[Perm.ProxyIndex]))
                    {
                        //++Perm.good;
                        while (true)
                        {
                            if (Perm.ProxyIndex >= Perm.ProxyValue)
                            {
                                ++Perm.ProxyIndex;
                                if (cheker(Perm.proxySS[Perm.ProxyIndex]))
                                {
                                    ++Perm.good;
                                    //textBox1.Text +=  Perm.proxySS[Perm.ProxyIndex] + " UP\r\n";
                                    Perm.proxyGood[Perm.good] = Perm.proxySS[Perm.ProxyIndex];
                                   // MessageBox.Show(Perm.tteer);
 
                                }
                                else
                                {
                                    //  textBox1.Text += Perm.proxySS[Perm.ProxyIndex] + " Down\r\n";
                                    //_ui(Form3.chek(Perm.proxySS[Perm.ProxyIndex]).ToString() + " Bed");
                                }
                            }
                            else
                            {
                                break;
                            }
                        }
                    }
                }
                else { break; }
            }
        }
0
 Аватар для LeniumSoft
1454 / 847 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
03.08.2015, 15:01
Эммм! Вы ping сделать пытаетесь?
0
 Аватар для stels009
16 / 15 / 1
Регистрация: 05.04.2011
Сообщений: 426
03.08.2015, 15:06  [ТС]
Цитата Сообщение от LeniumSoft Посмотреть сообщение
Эммм! Вы ping сделать пытаетесь?
Как я полагаю это уже должно быть в webclent
0
 Аватар для LeniumSoft
1454 / 847 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
03.08.2015, 15:17
Можете проект кинуть?
0
 Аватар для stels009
16 / 15 / 1
Регистрация: 05.04.2011
Сообщений: 426
03.08.2015, 15:36  [ТС]
Скажу только, что там говнокодная помойка, так-что не сильно впечатляйтесь=))
Вложения
Тип файла: rar Mel.rar (132.0 Кб, 8 просмотров)
0
 Аватар для LeniumSoft
1454 / 847 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
03.08.2015, 15:57
Цитата Сообщение от stels009 Посмотреть сообщение
Скажу только, что там говнокодная помойка, так-что не сильно впечатляйтесь
А можно ещё чудо txt файл, которым вы это чудо кормите?
0
 Аватар для stels009
16 / 15 / 1
Регистрация: 05.04.2011
Сообщений: 426
03.08.2015, 16:07  [ТС]
Тут пара файлов
https://grigorio.ru/база
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.08.2015, 16:07
Помогаю со студенческими работами здесь

Прервать выполнение функции через определенный промежуток времени
Друзья, здравствуйте. Есть некоторая функция, которая может отработать за несколько секунд, а может черт знает за сколько. Хочется...

Приостановить выполнение функции до наступления определённого момента времени
Допустим есть задача вывести сообщение ХХХ ровно 10 декабря 2017 года в 16:10. Как это реализовать? Идея создать цикл перед выведением...

Ограничение группы пользователей на выполнение команд по SSH
Здравствуйте! Есть группа gusers, в ней много юзеров, которые имеют доступ к серверу по SSH, да и вообще имеют права на выполнение...

ограничение по времени 20 мс
Здравствуйте, подскажите пожалуйста что в данном простом коде занимает наибольшее количество времени ( ограничение по времени 20 мс...

Ограничение времени ввода.
нада дать юзеру 10 сек на ввод значения Х. Еси он провтыкал 10 сек, то стандартно Х = 0. в худшем случае дать возможность 10 секунд...


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

Или воспользуйтесь поиском по форуму:
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