Windows 窗体将始终保持打开状态,直到它们被用户明确关闭。它们总是有一个线程读取消息队列以获取用户输入,因此它们不会像无限制的控制台应用程序那样退出。在 Windows 窗体中,我们必须比在控制台应用程序中更多地担心多线程和并发性。它大多是自然产生的,但并非总是如此。
因此,您不能真正使用等效的 toConsole.Read()
来推迟using
处理的执行,直到用户请求它。如果你这样做了,你的表单只会显得没有响应。
不过,你很幸运!C# 中的using
块只不过IDisposable.Dispose()
是在完成对象后记住调用的语法糖。因此,在 Forms 项目中与此等价的可能只是将server
对象存储在类范围的字段中,然后调用server.Dispose()
,比如说,一个Button.Click
事件。当然,这只是一个例子。Form.Closing
如果感觉更合适,您也可以这样做。
高级别的,你想做这样的事情:
- 在表单类中声明一个字段
TftpServer server;
。
- 注册一个
Load
事件以及您server
在构造函数中运行所需的任何内容。
- 在活动中打开您的
server
领域Form_Load
。
- 在您的生活中使用
server
您认为合适的事件Form
。您可能不必担心并发性,但这是另一个问题的问题。
- 调用
server.Dispose()
表单的Dispose
事件。
在本质上,
class main : Form
{
private TftpServer server;
public main()
{
InitializeComponent();
this.Load += main_Load;
server = new TftpServer();
server.OnReadRequest += new TftpServerEventHandler(server_OnReadRequest);
server.OnWriteRequest += new TftpServerEventHandler(server_OnWriteRequest);
}
private void main_Load(object sender, EventArgs e)
{
server.Start();
}
private void server_OnReadRequest(/* I wasn't sure of the arguments here */)
{
// use the read request: give or fetch its data (depending on who defines "read")
}
private void server_OnWriteRequest(/* I wasn't sure of the arguments here */)
{
// use the write request: give or fetch its data (depending on who defines "write")
}
protected override void Dispose(bool disposing)
{
if (server != null) // since Dispose can be called multiple times
{
server.Dispose();
server = null;
}
}
}