Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Шаблон кода / 8 сообщений из 8, страница 1 из 1
08.06.2013, 19:28
    #38291394
voa
voa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шаблон кода
Добрый день.

Есть какой-то веб сервис от которого мне надо получать данные.
У меня сборка работы с сервисом готовая, вносить изменения в нее не могу.
Я только вызываю методы и получаю то что запросил.

Теперь задача. Если при выполнении запроса пропало соединение,
попробовать подключиться несколько раз и если подключение успешно, закончить запрос.

Вот что у меня получилось:
Код: 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.
/*
Любой код
*/

                Int32 attempt = 0;
                while (attempt++ < 2)
                {
                    try
                    {
 /*
 Собственно здесь запрос. Может быть любой код
*/
                        break;
                    }
                    catch (WebException ex)
                    {
                        if ((ex.Status & (WebExceptionStatus.ConnectFailure | WebExceptionStatus.ConnectionClosed)) > 0)
                        {
                            // the connection attempt
                            if (TryAutoLogon())
                            {
                                continue;
                            }
                        }
                        // send exception up
                        throw new WebException(ex.Message, ex);
                    }
                }
/*
Любой код
*/



Это работает.
Проблема в том, что такой код приходится вставлять во множество мест.
Посоветуйте как правильно сделать, чтобы не повторять одно и то же.
...
Рейтинг: 0 / 0
08.06.2013, 19:58
    #38291421
beg-in-er
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шаблон кода
voa,

так пойдёт?
Код: 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 static void k1(Action A1,Action A2,Action A3)
{
 A1();
                Int32 attempt = 0;
                while (attempt++ < 2)
                {
                    try
                    {
 A2();
                        break;
                    }
                    catch (WebException ex)
                    {
                        if ((ex.Status & (WebExceptionStatus.ConnectFailure | WebExceptionStatus.ConnectionClosed)) > 0)
                        {
                            // the connection attempt
                            if (TryAutoLogon())
                            {
                                continue;
                            }
                        }
                        // send exception up
                        throw new WebException(ex.Message, ex);
                    }
                }
 A3();
}
...
Рейтинг: 0 / 0
08.06.2013, 22:57
    #38291497
SeVa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шаблон кода
Качаешь entlib 6.0, создаешь своб политику исключений, применяешь RetryPolicy

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
//usage
this.retryPolicy.ExecuteAction(() =>DoAction());

public void DoAction(//)
{
  
  try
{
     //....
}
catch (Exception ex)
{
          Exception exceptionToThrow;
          if (ExceptionPolicy.HandleException(ex, "WebException",out exceptionToThrow))
         {
             if (exceptionToThrow == null)
                throw;
            else
              throw exceptionToThrow;
          }
}
}



Это будет более общий вариант. Изолируешь логику повторов и обработки исключений, если потребуются изменения, то не нужно будет перелопачивать весь код
...
Рейтинг: 0 / 0
09.06.2013, 00:21
    #38291532
voa
voa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шаблон кода
SeVa,

Не могу, нельзя. Можно пользоваться только тем, что есть.
...
Рейтинг: 0 / 0
09.06.2013, 00:21
    #38291533
voa
voa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шаблон кода
beg-in-er,

Спасибо, попробую.
...
Рейтинг: 0 / 0
09.06.2013, 08:15
    #38291583
SeVa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шаблон кода
В угол тебя некому ставить
...
Рейтинг: 0 / 0
09.06.2013, 10:48
    #38291609
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шаблон кода
SeVaКачаешь entlib 6.0, создаешь своб политику исключений, применяешь RetryPolicy

+100500

Накрайняк можно руками и через аспекты (PostSharp)

Вот обсуждение по сходной тематике


Можно вообще без них, но некрасиво

Код от руки

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
class Executer
{
public static void Run(Action action) 
{
	// всяческий дополнительный код, в т.ч. и зацикливание


	try
	{
		action();
	}
	catch 
	{
		// обработка ошибок
	}
}
}



В коде:
Код: c#
1.
Executer.Run(() =>  /* Собственно здесь запрос. Может быть любой код */)
...
Рейтинг: 0 / 0
09.06.2013, 18:22
    #38291774
voa
voa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шаблон кода
Arm79,

Спасибо всем добрым взрослым дядям. Уроки выучил :)
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Шаблон кода / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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