【问题标题】:Check internet connection is available or not检查互联网连接是否可用
【发布时间】:2014-04-14 22:42:34
【问题描述】:

我正在尝试检测互联网连接,如果互联网连接可用并且已连接,它将继续,否则会抛出消息框说连接不可用。

我遇到的是互联网连接是否连接,代码将继续。

代码如下:

** 即使没有可用的互联网连接,该程序也会继续worker_ProgressChanged **

public CheckUpdates()
        {
            InitializeComponent();

            bool checkConnection = CheckConnection.IsConnectedToInternet();

            progressBar1.Style = ProgressBarStyle.Marquee;

            if (checkConnection == true)
            {
                backgroundWorker1.WorkerReportsProgress = true;
                backgroundWorker1.DoWork += new DoWorkEventHandler(worker_DoWork);
                backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
                backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
            }

            else
            {
                System.Media.SoundPlayer _sound = new System.Media.SoundPlayer(@"C:\Windows\Media\Windows Notify.wav");
                _sound.Play();

                DialogResult _dialogResult = MessageBox.Show("No connection available, please check your internet connection!", "No connection");

                if (_dialogResult == DialogResult.OK)
                {
                    this.Hide();

                    this.Close();
                }
            }

        }

        private void CheckUpdates_Load(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync();
        }

        void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;

            if (e.ProgressPercentage.Equals(100))
            {
                System.Media.SoundPlayer _sound = new System.Media.SoundPlayer(@"C:\Windows\Media\Windows Notify.wav");
                _sound.Play();

                DialogResult _dialogResult = MessageBox.Show("No updates were available!", "No updates");

                if (_dialogResult == DialogResult.OK)
                {
                    this.Hide();

                    this.Close();
                }
            }
        }

        void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            _timer.Enabled = true;
            _timer.Tick += new EventHandler(Timer_Tick);
        }

        void worker_DoWork(object sender, DoWorkEventArgs e)
        {
            for (int i = 0; i <= 100; i++)
            {
                backgroundWorker1.ReportProgress(i);
                System.Threading.Thread.Sleep(100);
            }
        }

        void Timer_Tick(object sender, EventArgs e)
        {
            _timer.Enabled = false;
        }

class CheckConnection
    {
        [DllImport("wininet.dll")]

        private extern static bool InternetGetConnectedState(out int Description, int ReservedValue);

        public static bool IsConnectedToInternet()
        {
            int Desc;
            return InternetGetConnectedState(out Desc, 0);
        }

    }

非常感谢您的回答!

非常感谢!

【问题讨论】:

  • 那是很多愚蠢的代码,没有做任何你展示给我们的事情。后台工作人员只是在循环。计时器没有做任何事情。
  • 让我知道谁在调用事件 CheckUpdates_Load 或 WelcomeScreen_Load
  • @Steve:对不起,WelcomeScreen_Load 来自其他表单,我只是复制并粘贴 WelcomeScreen 表单上的所有内容(因为欢迎屏幕也包含后台工作人员),对于 CheckUpdates_Load,该事件当我单击链接到上面代码中未显示的 CheckUpdates 表单的按钮时将触发(关于我如何调用 CheckUpdates 表单)

标签: c# winforms connection


【解决方案1】:

因为您在事件WelcomeScreen_Load 或事件CheckUpdates_Load 中调用backgroundWorker1.RunWorkerAsync(); 而不检查Internet 是否已连接。 (可能worker_ProgressChanged 是在设计时使用 backgroundWorkder 属性定义的)

这些事件似乎与 Form.Load 事件处理程序无关,因为您的类不是从 Form 派生的。但是,您似乎很清楚您需要在那里进行检查,否则触发这些事件的人将启动您的后台工作人员。

    private void CheckUpdates_Load(object sender, EventArgs e)
    {
        if(CheckConnection.IsConnectedToInternet())
             backgroundWorker1.RunWorkerAsync();
    }

    private void WelcomeScreen_Load(object sender, EventArgs e)
    {
        if(CheckConnection.IsConnectedToInternet())
             backgroundWorker1.RunWorkerAsync();
    }

【讨论】:

  • 对不起,WelcomeScreen_Load 来自其他表单,我只是将所有内容复制并粘贴到 WelcomeScreen 表单上(因为欢迎屏幕也包含后台工作人员),对于 CheckUpdates_Load,该事件将在以下时间触发我单击链接到 CheckUpdates 表单的按钮,该按钮未在上面的代码中显示(关于我如何调用 CheckUpdates 表单)。谢谢你的回答。我真的很感激:D
  • 嗯,从上面的代码来看,不启动后台工作者是无法到达worker_ProgressChanged事件的。我建议使用调试器,在 CheckUpdates_Load 和 WelcomeScreen_Load 中放置一个断点,如果你命中了断点,查看堆栈窗口找出谁是调用者
  • 也许我错了,但我很确定存在一些令人讨厌的复制/粘贴不匹配(InitializeComponent,但类构造函数中没有表单继承?)
猜你喜欢
  • 1970-01-01
  • 2017-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多