创建了一个方法,以便在启动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对象。当我把这个方法添加到一个按钮上时,它工作得很好。我基本上需要这个方法在我的应用程序中初始化,用户不需要按任何按钮就可以运行它。我花了三天时间没有任何进展。
希望我说的够清楚了。
干杯!干杯!
1条答案
按热度按时间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。
请参阅以下内容以了解更多详细信息和backgroundworker的全部功能以及更好的示例:https://learn.microsoft.com/en-us/dotnet/api/system.componentmodel.backgroundworker?view=net-6.0