winforms Windows Form C#的方法

anauzrmj  于 2022-11-17  发布在  Windows
关注(0)|答案(1)|浏览(134)

创建了一个方法,以便在启动Windows窗体应用程序时使用该方法进行初始化。但是,当我在InitializeComponent();下面调用该方法时,整个Windows窗体应用程序都没有启动,也没有引发任何错误。

Myclass mc = new Myclass();

        public Interceptor()
        {

            InitializeComponent();

             mc.myMethod();

             >rest of the code
        }

这是具有方法的类别:

public class Listener
    {   
        public void myMethod() { 

            //Recieving the parameters to listen
            Int32 port = 5000;
            IPAddress ip = IPAddress.Parse("1.1.1.1");
            TcpListener server = new TcpListener(ip, port);

            //starting the server
            server.Start();

            //Accepting connection from the Client
            Socket socket = server.AcceptSocket();

            //Storing the data
            byte[] bytes = new byte[4096];
            int k = socket.Receive(bytes);

            //???
            ASCIIEncoding asen = new ASCIIEncoding();
            string data = null;
            data = Encoding.ASCII.GetString(bytes, 0, k);

            //Reading all the data using the TextReader()
            TextReader reader = new StringReader(data);

            XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
            MyObject obj = (MyObject)serializer.Deserialize(reader);

            string json = JsonConvert.SerializeObject(icx, Formatting.Indented, new JsonSerializerSettings
            {
                NullValueHandling = NullValueHandling.Ignore
            });

            string path = @"c:/temp";
            string name = "test";

            if (!Directory.Exists(path)) Directory.CreateDirectory(path);

            string fileName = $"{path}\\{name}.json";
            File.WriteAllText(fileName, json);
        }
    }

正如你们所看到的,我的方法是反序列化一个XML对象并序列化为JSON对象。当我把这个方法添加到一个按钮上时,它工作得很好。我基本上需要这个方法在我的应用程序中初始化,用户不需要按任何按钮就可以运行它。我花了三天时间没有任何进展。
希望我说的够清楚了。
干杯!干杯!

gdrx4gfi

gdrx4gfi1#

你的Interceptor()方法是表单的构造函数,所以当你创建表单时,这个方法被调用,构造函数的工作是初始化表单,设置默认值等等。
通过将mc.myMethod()放置在构造函数中,实际上是在强制它启动业务逻辑。这意味着,它将在表单完成创建(和显示)之前执行。
因此,这是不好的,因为此方法中的代码会阻塞UI线程,这就是出现此问题的原因,因为在处理数据和阻塞UI之前,您不允许完成窗体的创建。
您应该改用Form.Load事件,或者选择性地使用Form.Activate或Form.Shown事件。若要了解两者之间的差异以及哪一种事件最适合您,请参阅以下内容:https://learn.microsoft.com/en-us/dotnet/desktop/winforms/order-of-events-in-windows-forms?view=netframeworkdesktop-4.8
尽管这是一种更好的方法,但仍然存在代码阻塞UI线程的问题。
因此,您需要考虑使用其他方法来避免这种情况。
有不同的方法可以做到这一点,但其中一种方法是使用backgroundworker。

//Initialise the worker and set the worker method
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += bw_DoWork;

//Start the worker
bw.RunWorkerAsync();


private void bw_DoWork(object sender, DoWorkEventArgs e)
{
    //Put your myMethod code here
}

请参阅以下内容以了解更多详细信息和backgroundworker的全部功能以及更好的示例:https://learn.microsoft.com/en-us/dotnet/api/system.componentmodel.backgroundworker?view=net-6.0

相关问题