【发布时间】:2014-03-10 16:33:46
【问题描述】:
我正在尝试制作一个服务器面板来检查我的三台服务器是否在线。 如果有 3 个远程服务器正在运行并且想知道它们是否在线。 我正在尝试做的是三个线程正在检查 1 个服务器的状态并根据结果采取行动。
class ServerChecker
{
private byte firstIP, secondIP, thirthIP, fourthIP;
private string message;
private Boolean status;
private Ping ping = new Ping();
//Zet de waardes van de IP gelijk aan die van de class. En gaat daarna de server pingen.
public Boolean checkConnection(byte first, byte second, byte thirth, byte fourth)
{
this.firstIP = first;
this.secondIP = second;
this.thirthIP = thirth;
this.fourthIP = fourth;
return connection();
}
//Stuurt een Ping naar de server en bekijkt de response en reageert op de response
private Boolean connection()
{
PingReply reply;
try
{
reply = ping.Send(new IPAddress(new byte[] { firstIP, secondIP, thirthIP, fourthIP }), 3000);
//Als er een correct response is server online
if (reply.Status == IPStatus.Success)
{
this.status = true;
this.message = " De Server is online...";
}
//Als er een incorrecte response is server offline
else
{
this.status = false;
this.message = " De Server is Offline...";
}
}
//Als er iets fout gaat vang de fout op en geef een message.
catch (Exception)
{
this.status = false;
this.message = " Er is iets Fout gegaan";
}
return this.status;
}
public string getMessage()
{
return this.message;
}
}
这是我的表格
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.Threading;
namespace Server.ProgramForm
{
public partial class Form1 : Form
{
private Image WebsiteServerImage,DatabaseServerImage,ApplicatieServerImage,WebsiteImage,DatabaseImage,ApplicatieImage;
private Engine.ThreadHandler thread;
public Form1()
{
InitializeComponent();
InitializeImages();
}
private void Form1_Load(object sender, EventArgs e)
{
this.WebsiteServer_Image.Image = WebsiteServerImage;
this.DatabaseServer_Image.Image = DatabaseServerImage;
this.ApplicatieServer_Image.Image = ApplicatieServerImage;
}
private void InitializeImages()
{
setWebsiteServerImageDisabled();
setDatabaseServerImageDisabled();
setApplicatieServerImageDisabled();
}
public void setWebsiteServerImage(Boolean Status)
{
switch (Status)
{
case true: WebsiteServer_Image.Image = global::Server.Properties.Resources.web_online;
break;
case false: WebsiteServer_Image.Image = global::Server.Properties.Resources.web_offline;
break;
}
}
public void setWebsiteServerImageDisabled()
{
WebsiteServerImage = global::Server.Properties.Resources.web_error;
}
public void setDatabaseServerImage(Boolean Status)
{
switch (Status)
{
case true: DatabaseServerImage = global::Server.Properties.Resources.db_online;
break;
case false: DatabaseServerImage = global::Server.Properties.Resources.db_offline;
break;
}
}
public void setDatabaseServerImageDisabled()
{
DatabaseServerImage = global::Server.Properties.Resources.db_error;
}
public void setApplicatieServerImage(Boolean Status)
{
switch (Status)
{
case true: ApplicatieServerImage = global::Server.Properties.Resources.dev_online;
break;
case false: ApplicatieServerImage = global::Server.Properties.Resources.dev_offline;
break;
}
}
public void setApplicatieServerImageDisabled()
{
ApplicatieServerImage = global::Server.Properties.Resources.dev_error;
}
}
}
这是我的程序(主)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace Server.Engine
{
class Program
{
private static ProgramForm.Form1 form = new ProgramForm.Form1();
private static ThreadHandler thread;
private static Boolean websiteStatus;
public static void Main()
{
//Start eerst de Threads voordat je Form laat zien
thread = new ThreadHandler(form);
thread.startWebsiteThread();
thread.startDatabaseThread();
form.ShowDialog();
}
}
}
ThreadHandler 类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace Server.Engine
{
class ThreadHandler
{
private Thread DatabaseServerThread,ApplicatieServerThread,WebsiteServerThread;
private Checkers.ServerChecker ServerChecker=new Checkers.ServerChecker();
private ProgramForm.Form1 form;
private Boolean DatabaseServerStatus, WebsiteServerStatus, ApplicatieServerStatus;
private System.Threading.Timer DatabaseServerTimer;
//Constructor
public ThreadHandler(ProgramForm.Form1 temp)
{
this.form = temp;
}
//Start de DatabaseServer Thread
public void startDatabaseThread()
{
this.DatabaseServerThread = new Thread(new ThreadStart(DatabaseThreadHandling));
this.DatabaseServerThread.Start();
}
//Regelt de handelingen van de Database Thread
private void DatabaseThreadHandling()
{
if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable() == true)
{
//Geeft true terug als de ping slaagd.
this.DatabaseServerStatus = ServerChecker.checkConnection(145, 24, 222, 103);
form.setDatabaseServerImage(this.DatabaseServerStatus);
}
else
{
form.setDatabaseServerImageDisabled();
}
}
//Start de WebsiteServer Thread
public void startWebsiteThread()
{
this.WebsiteServerThread = new Thread(new ThreadStart(WebsiteThreadHandling));
this.WebsiteServerThread.Start();
}
private void WebsiteThreadHandling()
{
if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable() == true)
{
//Geeft true terug als de ping slaagd.
this.WebsiteServerStatus = ServerChecker.checkConnection(145, 24, 222, 118);
form.setWebsiteServerImage(this.WebsiteServerStatus);
}
else
{
form.setWebsiteServerImageDisabled();
}
}
//Start de ApplicatieServer Thread
public void startApplicatieThread()
{
}
}
}
我的问题是这只会更新我的 UI。它不会改变。 我没有办法解决问题。我试图在我的 UI 线程上运行代码,但这是一个更糟糕的主意,它给 UI 带来了市长滞后。 我想做的是。当 serverChange 发生时。将图像和标签从在线更改为离线。但我想运行该进程来检查另一个线程上的服务器状态(总共 3 个)。当我尝试更改为图片时,我收到一个错误,我无法更改其他线程上的控件。 使用我发布的代码,它只运行那些.. 有人提出了如何解决这个问题的绝妙主意。
【问题讨论】:
标签: c# multithreading winforms user-interface