Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用线程C#Windows窗体在运行时更改GUI_C#_Multithreading_Winforms_User Interface - Fatal编程技术网

使用线程C#Windows窗体在运行时更改GUI

使用线程C#Windows窗体在运行时更改GUI,c#,multithreading,winforms,user-interface,C#,Multithreading,Winforms,User Interface,我正在尝试制作一个服务器面板来检查我的三台服务器是否在线。 如果有3台远程服务器正在运行,并想知道它们是否在线。 我试图做的是三个线程检查1台服务器的状态并对结果采取行动 class ServerChecker { private byte firstIP, secondIP, thirthIP, fourthIP; private string message; private Boolean status; private Ping ping = new Pi

我正在尝试制作一个服务器面板来检查我的三台服务器是否在线。 如果有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;
        }
    }
}
这是我的程序(主)

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一个更大的延迟。 我想做的是。当服务器发生变化时。将图像和标签从联机更改为脱机。但是我想运行这个进程来检查另一个线程上服务器的状态(总共3个)。当我尝试更改为图片时,我得到一个错误,即我无法更改其他线程上的控件。 我发布的代码只运行一个。。 有人想出了解决这个问题的绝妙办法

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

或者类似的事情我解决了这个问题。我以加载和创建重绘函数的形式创建了一个计时器。 我将控件设置为这样的变量。 This.picturebox.Image=tempImage 其中tempImage是图像的类型。 我从另一个线程更改tempImage,而不让该线程直接更改控制器。 如果你想要样品,你可以随时留言

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