Изменение GUI во время выполнения с помощью потоков С# Windows Form

Я пытаюсь сделать серверную панель, которая проверяет, находятся ли мои три сервера в сети. Если у вас запущено 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 мэра lagg. Я пытаюсь это сделать. Когда происходит событие serverChange. Измените изображение и ярлык из сети в автономный. Но я хочу запустить процесс, чтобы проверить статус сервера в другом потоке (всего 3). Когда я пытаюсь перейти к изображениям, я получаю сообщение об ошибке, что я не могу изменить элементы управления в другом потоке. С кодом, который я разместил, он только запускал. Кто-то получил блестящую идею, как решить эту проблему.

2 ответа

Я решил проблему. Я создал таймер в form_load и создал функцию repaint. Я установил элементы управления как переменную. This.picturebox.Image = tempImage, где tempImage - тип изображения. Я изменяю tempImage из другого потока, не позволяя потоку напрямую изменять контроллер. Если вы хотите образец, вы всегда можете оставить сообщение


form.Invoke(new Action(() => label.Text = "offline"));

Или что-то в этом роде

licensed under cc by-sa 3.0 with attribution.