【问题标题】:Change GUI on runtime with threads C# Windows Form使用线程 C# Windows 窗体在运行时更改 GUI
【发布时间】: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


    【解决方案1】:
    form.Invoke(new Action(() => label.Text = "offline"));
    

    或类似的东西

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2015-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-08
        • 1970-01-01
        • 1970-01-01
        • 2011-06-23
        相关资源
        最近更新 更多