当前位置:萝卜系统 > 网络技术教程 > 详细页面

编程手段动态检测连接十分耗时,主线程的一切设置

编程手段动态检测连接十分耗时,主线程的一切设置

更新时间:2023-08-27 文章作者:未知 信息来源:网络 阅读次数:

网络故障(network failure)是指由于硬件的问题、软件的漏洞、病毒的侵入等引起网络无法提供正常服务或降低服务质量的状态。

如今,桌面程序不再像以前那样完全独立于网络,并且各种功能都与Internet连接密不可分。程序通常需要Internet连接来执行诸如自动更新,WebService调用等操作以访问远程数据,但是在实际访问远程数据之前,我们最好确保远程连接可用,以便程序的过程和健壮性程序可以是很了不起的。通过编程方式动态检测Internet连接非常耗时,因此,如果不使用多线程,则程序接口将在检测期间死锁,并且检测连接占用了主线程的所有操作。当检测到远程连接是否可用时,主界面经常死锁,并不是良好的用户体验。在本文中,我们将为这个问题创建一个C#组件。主要目标是创建一个用于测试远程连接的标准框架。该测试必须是多线程的,并且必须在后台执行。成功检测到连接后,必须通知它。主线程会对连接可用的情况做出反应,例如打开网页,开始自动更新以及开始调用WebService。

利用backgroundworker检测网络连接

在开始之前,我们需要列出项目需要使用的相关技术。

在检测Internet连接的方法中,我们采用了不同的策略。可以想象,任何客户端程序在需要连接到Internet时都必须具有一个地址。该地址不过是一个IP地址或域名和端口数据。客户端程序通过该地址与远程主机建立连接以进行数据交换。然后,我们的客户端程序将直接检测该地址是否可用,以近似估算Internet连接是否可用。地址可用性证明Internet连接也可用,而地址不可用性证明两点:1、地址无效; 2、 Internet连接不可用。但是地址无效的可能性很小。首先,程序员不可能为客户端程序提供一个无效的地址来尝试连接,然后服务器端瘫痪的可能性就很小,例如尝试连接或。

好的,让我们开始创建检测组件。

首先我们创建一个Windows窗体应用程序,然后添加一个组件,这些过程将不再详述。我们将新组件命名为InternetConnection,首先定义两个私有字段:BackgroundWorker类型的bgworker和字符串类型的可靠的URL。然后定义两个属性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

public string ReliableURL
{
get { return reliableURL; }
set { reliableURL = value; }
}

public bool Active
{
set
{
if (value == true)
{
bgworker.RunWorkerAsync();
}
else
{
bgworker.CancelAsync();
}
}
}

ReliableURL属性是我们前面提到的所谓的远程地址。我们通过访问可靠的地址或我们自己的Web服务地址来间接检查Internet连接是否可用。 Active属性允许控制BackgroundWorker的异步执行状态,并且通过将该组件的Active属性设置为true来启动后台Internet连接检测。

利用backgroundworker检测网络连接_微信连接失败无法连接服务器请检查你的网络_lol连接错误 无法连接服务器 请检查您的网络

接下来,我们需要定义事件。为了简单起见,我们为此组件定义了两个事件Connected和ConnectFailure。前者是成功连接后触发的事件,后者是由于连接失败触发的事件。我们的事件不需要传递参数。有关事件的更多详细信息,请参阅我的另一篇博客文章:.Net事件和代表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

public event EventHandler Connected;
public event EventHandler ConnectFailure;

protected virtual void OnConnected(EventArgs e)
{
if (Connected != null)
{
Connected(this, e);
}
}

protected virtual void OnConnectFailure(EventArgs e)
{
if (ConnectFailure != null)
{
ConnectFailure(this, e);
}
}

接下来,我们创建代码以检测连接。有关使用BackgroundWorker的更多方法,请参阅MSDN或我的另一篇博客文章:实用.Net多线程(三)和实用.Net多线程(四))。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
try
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(reliableURL);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (HttpStatusCode.OK == response.StatusCode)
{
response.Close();
e.Result = true;
}
else
{
e.Result = false;
}
}
catch (WebException)
{
e.Result = false;
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
throw e.Error;
}
else
{
if ((bool)e.Result) // Online
{
OnConnected(e);
}
else // Offline
{
OnConnectFailure(e);
}
}
}

微信连接失败无法连接服务器请检查你的网络_利用backgroundworker检测网络连接_lol连接错误 无法连接服务器 请检查您的网络

最后,在组件的初始化方法中实例化相关的私有字段。

1
2
3
4
5
6
7
8
9
10

public InternetConnection(IContainer container)
{
container.Add(this);
InitializeComponent();
bgworker = new BackgroundWorker();
bgworker.WorkerReportsProgress = false;
bgworker.WorkerSupportsCancellation = false;
bgworker.DoWork += new DoWorkEventHandler(this.BackgroundWorker_DoWork);
bgworker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(this.BackgroundWorker_RunWorkerCompleted);
}

创建组件后,编译整个解决方案,打开最初创建的项目WindowsFormsApplication1的Form1窗体,我们将在VS IDE的工具箱中找到刚创建的名为InternetConnection的组件,并将其拖到Form1上。窗体中,有一个类型为internetConnection1的实例。我们在窗体上放置一个Button,一个WebBrowser和一个StatusStrip,并将StatusLabel添加到StatusStrip。我们使用WebBrowser来显示特定的网页,以指示Internet连接可用。

选择internetConnection1,我们将发现它暴露了两个事件,我们为这两个事件添加了相应的处理代码:

1
2
3
4
5
6
7
8
9
10
11
12
13

private void internetConnection1_Connected(object sender, EventArgs e)
{
toolStripStatusLabel1.Image = Properties.Resources.Online;
toolStripStatusLabel1.Text = "已连接到 Internet,正在打开 it168.com 网页....";
webBrowser1.Navigate("http://www.it168.com/");
}

private void internetConnection1_ConnectFailure(object sender, EventArgs e)
{
toolStripStatusLabel1.Image = Properties.Resources.Offline;
toolStripStatusLabel1.Text = "未连接到 Internet";
webBrowser1.Navigate(Application.StartupPath + "\\Error.html");
}

连接成功后,将显示一个远程网页,并在失败时显示一个自定义的HTML文件。如下图所示:

利用backgroundworker检测网络连接_微信连接失败无法连接服务器请检查你的网络_lol连接错误 无法连接服务器 请检查您的网络

利用backgroundworker检测网络连接

利用backgroundworker检测网络连接

将相应的代码添加到WebBrowser的DocumentCompleted事件中,以响应网页加载的完成:

1
2
3
4

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
toolStripStatusLabel1.Text = "完成";
}

最后,在Button的click事件中添加代码以启动测试连接:

1
2
3
4
5
6
7

private void button1_Click(object sender, EventArgs e)
{
internetConnection1.ReliableURL = "http://www.google.cn"; //要检测的网络连接
internetConnection1.Active = true;
toolStripStatusLabel1.Image = Properties.Resources.Searching;
toolStripStatusLabel1.Text = "正在尝试连接远程服务器....";
}

此时,已创建了一个自定义Internet连接组件。该程序已在Windows SP3 + Visual Studio 2008 SP1的环境下成功编译和调试。


本文来自本站,转载请注明本文网址:
http://www.pc-fly.com/a/tongxingongju/article-362771-1.html


当今,越来越多的业务应用运行于网络架构之上,保障网络的持续、高效、安全的运行,成为网络管理者面临的巨大挑战。

温馨提示:喜欢本站的话,请收藏一下本站!

本类教程下载

系统下载排行

网站地图xml | 网站地图html