С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
volchek
0 / 0 / 0
Регистрация: 25.03.2015
Сообщений: 5
1

Запрос в сеть завешивает приложение

25.03.2015, 02:45. Просмотров 304. Ответов 9
Метки нет (Все метки)

Прога зависает с запроса в сеть. Какими способами это можно изолировать?
Пробовал делать в новом потоке и снимать поток при зависании. Так поток зависает и все с clr зависает.
Какие возможны решения проблемы?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.03.2015, 02:45
Ответы с готовыми решениями:

Сделать клиент серверное приложение (только локальная сеть).
Здравствуйте, помогите советом куда копать, что почитать, как проще всего...

Sql запрос завешивает программу
Всем привет, такая проблема, есть работающий запрос (сократил, тк он большой):...

запрос(client)->сеть->mysql(server)
подскажите ,пожалуйста, как организовать работу. мне надо послать запрос по...

Как уже готовый запрос или отчет с БД Access перенести в приложение на C#?
Доброго времени суток. Не могу разобраться как уже готовый запрос или отчет с...

Проверка на существование файла или папки в сети завешивает приложение
Привет! Подскажите, почему если сделать проверку на существование файла или...

9
Casper-SC
Эксперт .NET
3638 / 1843 / 360
Регистрация: 27.03.2010
Сообщений: 5,169
Записей в блоге: 1
25.03.2015, 10:01 2
Может нужно решать проблему на конкретной проблеме? Код где?

Добавлено через 11 секунд
Используй другой поток.

Добавлено через 2 минуты
Цитата Сообщение от volchek Посмотреть сообщение
Пробовал делать в новом потоке и снимать поток при зависании.
В эти слова ты и другие люди могут вкладывать разные понятия. Это я к тому, что без кода это просто слова.
0
volchek
0 / 0 / 0
Регистрация: 25.03.2015
Сообщений: 5
25.03.2015, 10:27  [ТС] 3
В общем проблема обстоит так.

C#
1
using SomeSDK.net;
делаешь простую команду
C#
1
AboutSDK aboutSDK = AuthSDK.Get().About();
эта команда иногда проходит, а иногда зависает. Предположительно через криво написанный сторонний SDK.

Хотелось бы это как-то изолировать. В Дельфи есть что-то типа IdAntiFreeze.
0
Casper-SC
Эксперт .NET
3638 / 1843 / 360
Регистрация: 27.03.2010
Сообщений: 5,169
Записей в блоге: 1
25.03.2015, 10:40 4
AboutSDK это просто какие-то данные? В смысле About меня натолкнуло на мысль чего-то связанного с UI.
0
volchek
0 / 0 / 0
Регистрация: 25.03.2015
Сообщений: 5
25.03.2015, 10:48  [ТС] 5
новый поток сделан через timer
через определенное время вызывается tick
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
AboutSDK aboutSDK;
void tick()
{
  if (AboutSDK!=null)
    {
     ThrdAbout = new Thread(() => { aboutSDK = AuthSDK.Get().About(); });
     ThrdAbout.Start();
     }
}
else
{
  if (timeisout(ThrdAbout))
  {
     ThtdAbout.Abort(); // Тут пробовал задержки делать Thread.Sleep(5000); Thread=null;
  }
}
симптомы те же раз работает, раз зависает. Причем зависает на обращении сделать новый поток
new Thread.

Добавлено через 2 минуты
Да, простые данные с SDK c сети. Там имя, id и прочая служебная информация
0
Casper-SC
Эксперт .NET
3638 / 1843 / 360
Регистрация: 27.03.2010
Сообщений: 5,169
Записей в блоге: 1
25.03.2015, 10:55 6
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using System;
using System.Threading;
using System.Threading.Tasks;
 
namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            Task<AboutSDK> task = Task<AboutSDK>.Factory.StartNew(() =>
             {
                 return AuthSDK.Get().About();
             });
 
            task.ContinueWith(tRes =>
            {
                if (tRes.Exception != null)
                {
                    //Тут можно детальнее получить инфу, чем показано в примере
                    Console.WriteLine(tRes.Exception.Message);
                }
                else
                {
                    Console.WriteLine(tRes.Result.Text);
                }
            }); //Контекст синхронизации будет взят из ThreadPool
 
            //Контекст синхронизации будет взят из UI потока (используй в WPF или WinForms)
            //}, TaskScheduler.FromCurrentSynchronizationContext());
 
            Console.ReadKey();
        }
    }
 
    internal class AboutSDK
    {
        public string Text { get; set; }
    }
 
    internal class AuthSDK
    {
        static Request _request;
 
        static AuthSDK()
        {
            _request = new Request();
        }
 
        public static Request Get()
        {
            return _request;
        }
    }
 
    class Request
    {
        public AboutSDK About()
        {
            Thread.Sleep(2000);
            return new AboutSDK { Text = "Я AboutSDK!" };
        }
    }
}
0
volchek
0 / 0 / 0
Регистрация: 25.03.2015
Сообщений: 5
25.03.2015, 12:01  [ТС] 7
Ого.Так быстро кодишь). Пошел пробовать. Через время отпишусь

Добавлено через 1 час 4 минуты
так сделал и так же, когда проходит всплывает about.Id. Иначе зависает. Exeption не всплывает.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
 task.ContinueWith(tRes =>
                             {
                              if (tRes.Exception != null)
                                {
                                 //Тут можно детальнее получить инфу, чем показано в примере
                                 MessageBox.Show(tRes.Exception.Message);
                                
                                }
                                 else
                                {
                                    aboutSDK = tRes.Result;
                                    MessageBox.Show(aboutSDK.Id);
                                }
0
Casper-SC
Эксперт .NET
3638 / 1843 / 360
Регистрация: 27.03.2010
Сообщений: 5,169
Записей в блоге: 1
25.03.2015, 12:09 8
Цитата Сообщение от volchek Посмотреть сообщение
так сделал и так же, когда проходит всплывает about.Id. Иначе зависает. Exeption не всплывает.
Покажи весь код.

Добавлено через 28 секунд
Включая то, откуда вообще вызывается само получение этих данных.
0
volchek
0 / 0 / 0
Регистрация: 25.03.2015
Сообщений: 5
25.03.2015, 12:44  [ТС] 9
C#
1
2
3
4
5
using SomeSDK;
 
public partial class Form1 : Form
    {
aboutSDK AboutSDK;...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
     public void GetAbout2()
        {
              Task<AboutSDK> task = Task<AboutSDK>.Factory.StartNew(() =>
                            {
                                return AuthSDK.Get().About();
                            });
                              task.ContinueWith(tRes =>
                             {
                              if (tRes.Exception != null)
                                {
                                  MessageBox.Show(tRes.Exception.Message);
                                 
                                }
                                 else
                                {
                                    aboutSDK = tRes.Result;
                                    MessageBox.Show(aboutSDK.RootFolderId);
                                }
                            }); 
 
 
 
        }
Вызов идет с
C#
1
2
3
4
   private void Form1_Load(object sender, EventArgs e)
        {
          GetAbout2();
        }
где-то так

Добавлено через 9 минут
AuthSDK.Get().About(); взято из документации. Это команда работает через раз.
Уверенность что правильно 100%, хотя допустив что ее использование неправильно.
Хотелось бы узнать как и впредь использовать механизм против зависаний от интернет-запросов.
Как это решено в Delphi c использованием IdAntiFreeze

Добавлено через 5 минут
пробовал снимать зависший поток, но это тоже не помогает.
Можно наплодить потоков с 10 с задержкой, до получения результата. Зависшие пусть так и висят.

Еще есть вариант с созданием домена и фоновых потоков, при снятии домена фоновые потоки сами отвалятся.
Есть еще вариант создавать новые процессы до получения результата.
0
Casper-SC
Эксперт .NET
3638 / 1843 / 360
Регистрация: 27.03.2010
Сообщений: 5,169
Записей в блоге: 1
25.03.2015, 13:38 10
Как минимум подвешивать потоки из пула не вариант. Тогда да, можно попробовать создавать просто новые потоки. Зависшие можно вручную убивать.

Это Drive REST API (Google) что ли?
0
25.03.2015, 13:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.03.2015, 13:38

Простой цикл завешивает программу
Доброго времени суток. Пишу программу которая сосчитает количество...

SAPI.spvoice завешивает приложение на время чтения
Драсти! Собсно из названия уже можно понять суть проблемы, но всё-же....

Вывод значения с COM порта в событии таймера завешивает приложение
На форме есть текстовое поле в которое нужно выводить значения с COM порта. ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru