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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Зависание асинхронного пинга в WinForm. 
V
    Опции темы
Kolovorot
Дата 15.2.2011, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Когда выполняю пример асинхронного пинга из мсдн http://msdn.microsoft.com/ru-ru/library/sy...ation.ping.aspx в коносле - все выполняется моментально. А вот когда пытаюсь переделать этот же пример под винформ - приложение зависает:
Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.NetworkInformation;
using System.Threading;

namespace TestWinFormAsyncPing
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        

        
        private void button1_Click(object sender, EventArgs e)
        {
            
            string who = "pavel131";
            AutoResetEvent waiter = new AutoResetEvent (false);

            Ping pingSender = new Ping ();

            // When the PingCompleted event is raised,
            // the PingCompletedCallback method is called.
            pingSender.PingCompleted += new PingCompletedEventHandler (PingCompletedCallback);

            // Create a buffer of 32 bytes of data to be transmitted.
            string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
            byte[] buffer = Encoding.ASCII.GetBytes (data);

            // Wait 12 seconds for a reply.
            int timeout = 120;

            // Set options for transmission:
            // The data can go through 64 gateways or routers
            // before it is destroyed, and the data packet
            // cannot be fragmented.
            PingOptions options = new PingOptions (64, true);
            label1.Text +=
            string.Format ("Time to live: {0}\n", options.Ttl);
            label1.Text+=string.Format ("Don't fragment: {0}", options.DontFragment);

            // Send the ping asynchronously.
            // Use the waiter as the user token.
            // When the callback completes, it can wake up this thread.
            pingSender.SendAsync(who, timeout, buffer, options, waiter);

            // Prevent this example application from ending.
            // A real application should do something useful
            // when possible.
            waiter.WaitOne ();
           label1.Text += string.Format ("Ping example completed.");
        }

        private void PingCompletedCallback (object sender, PingCompletedEventArgs e)
        {
            string text = "";
            // If the operation was canceled, display a message to the user.
            if (e.Cancelled)
            {
                string.Format ("Ping canceled.");

                // Let the main thread resume. 
                // UserToken is the AutoResetEvent object that the main thread 
                // is waiting for.
                ((AutoResetEvent)e.UserState).Set ();
            }

            // If an error occurred, display the exception to the user.
            if (e.Error != null)
            {
                text +=string.Format ("Ping failed:\n");
                text+=string.Format (e.Error.ToString ()) +"\n";

                label1.Text += text;

                // Let the main thread resume. 
                ((AutoResetEvent)e.UserState).Set();
                
            }

            PingReply reply = e.Reply;

            DisplayReply (reply);

            // Let the main thread resume.
            ((AutoResetEvent)e.UserState).Set();
        }

       public  void DisplayReply (PingReply reply)
        {
             
            if (reply == null)
                return;
             string text = 
          string.Format("ping status: {0}", reply.Status);
            if (reply.Status == IPStatus.Success)
            {
              text+=  string.Format ("Address: {0}\n", reply.Address.ToString ());
              text += string.Format("RoundTrip time: {0}\n", reply.RoundtripTime);
              text += string.Format("Time to live: {0}\n", reply.Options.Ttl);
              text += string.Format("Don't fragment: {0}\n", reply.Options.DontFragment);
              text += string.Format("Buffer size: {0}\n", reply.Buffer.Length);
            }

            label1.Text += text;
        }
       
    
        }
    }




Почему так происходит? И что сделать чтобы выполнялось нормально?smile 

Это сообщение отредактировал(а) Kolovorot - 15.2.2011, 09:16
--------------------
Никогда еще истина не повисала на руке безусловного. Фридрих Ницше. Так говорил Заратустра
PM MAIL   Вверх
jonie
Дата 15.2.2011, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Код

            // Prevent this example application from ending.
            // A real application should do something useful
            // when possible.
            waiter.WaitOne ();


тут и виснет. Ждет когда Event поставят в другом потоке..
соответственно убрать это дело + вот это 
Цитата

label1.Text += text;
заменить используя Control.Invoke().


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


Бывалый
*


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

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



То что нужно! Убрал waiter.WaitOne() зависание пропало.
--------------------
Никогда еще истина не повисала на руке безусловного. Фридрих Ницше. Так говорил Заратустра
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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