Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> установка ожидания, установка времени жизни потока 
:(
    Опции темы
DEADLY
Дата 17.11.2010, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 23.8.2007

Репутация: 1
Всего: 1



есть ф-ия которая посылает команду некому адресу, как сделать чтобы ф-ия если недождалась ответа вываливалась например через 30 сек
Код

public static String StartClient(IPAddress cIP, int port, String input)
        {
            try
            {
                int bytesRead;
                byte[] inbuf = Encoding.ASCII.GetBytes(input);
                Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                String response = String.Empty;
                StateObject state = new StateObject();

                state.workSocket = client;
                client.Connect(cIP, port);
                if (!client.Connected)
                    return "no response";
                client.Send(inbuf);              
                bytesRead = client.Receive(state.buffer);
                response = Encoding.ASCII.GetString(state.buffer, 0, bytesRead);
                //Console.WriteLine("Answer from {0}: {1}", cIP.ToString(), response);
                client.Shutdown(SocketShutdown.Both);
                client.Close();
                return response;
            }
            catch
            {               
                return "no response";
            }
        }

PM MAIL   Вверх
mrbrooks
Дата 17.11.2010, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 7
Всего: 306



используй асинхронную модель программирования.
PM MAIL   Вверх
mihryak
Дата 17.11.2010, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



для методов, не поддерживающих таймауты, использую такую штуку:
Код

    public class TimeoutableExecutor<TResult>
    {
        private const int DefaultTimeout = 3000;

        #region Constructors

        public TimeoutableExecutor()
            : this(DefaultTimeout)
        {
        }

        public TimeoutableExecutor(int timeout)
            : this(timeout, default(TResult))
        {
        }

        public TimeoutableExecutor(TResult defaultValue)
            : this(DefaultTimeout, defaultValue)
        {
        }

        public TimeoutableExecutor(int timeout, TResult defaultValue)
            : this(timeout, defaultValue, false)
        {
        }

        public TimeoutableExecutor(int timeout, TResult defaultValue, bool abortThreadOnTimeout)
        {
            Timeout = timeout;
            DefaultValue = defaultValue;
            AbortThreadOnTimeout = abortThreadOnTimeout;
        } 

        #endregion

        #region Properties

        public TResult DefaultValue { get; set; }

        public int Timeout { get; set; }

        public bool AbortThreadOnTimeout { get; set; }

        #endregion

        public TResult Execute(Func<TResult> function)
        {
            TResult result = default(TResult);
            Exception exception = null;
            AutoResetEvent autoResetEvent = new AutoResetEvent(false);
            Thread thread = new Thread(() =>
                                           {
                                               try
                                               {
                                                   result = function();
                                               }
                                               catch(Exception ex)
                                               {
                                                   exception = ex;
                                               }
                                               finally
                                               {
                                                   autoResetEvent.Set();
                                               }
                                           });
            thread.Start();

            if (autoResetEvent.WaitOne(Timeout, true))
            {
                if (exception != null)
                {
                    throw exception;
                }
                return result;
            }

            if (AbortThreadOnTimeout)
            {
                thread.Abort();
            }

            return DefaultValue;
        }
    }

Код

string result = new TimeoutableExecutor<string>(30000).Execute(() => StartClient(IP, port, input));

в случае таймаута вернёт default(string), т.е. null
можно переделать, чтобы кинул исключение
PM MAIL ICQ   Вверх
jonie
Дата 17.11.2010, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



mihryak, ваш код при Thread.Abort будет вести себя кхе-кхе.. "плохо"
Прочитайте:
http://sergeyteplyakov.blogspot.com/2009/0...oundworker.html
http://sergeyteplyakov.blogspot.com/2010/08/c-3.html
http://sergeyteplyakov.blogspot.com/2009/0...tion-rotor.html

ну и форумы rsdn про прерывание потока..


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
mihryak
Дата 17.11.2010, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



Цитата(jonie @  17.11.2010,  17:19 Найти цитируемый пост)
mihryak, ваш код при Thread.Abort будет вести себя кхе-кхе.. "плохо"

спасип за ссылки
собственно, разъяснение, чем же так плох Abort здесь в последнем разделе
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0614 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.