gpt4 book ai didi

c# - 不确定我是否在 tftp 应用程序中正确使用 "using"c#

转载 作者:行者123 更新时间:2023-11-30 13:37:09 27 4
gpt4 key购买 nike

我正在尝试使用 this使用我的 Windows C# 窗体预制 C# tftp 服务器应用程序。在作者的服务器示例中,效果很好,他使用了控制台应用程序。当我尝试将他的控制台示例移植到我的表单应用程序中时,它不起作用(没有错误,只是没有连接),我相信我的问题出在“使用”语句中:

using (var server = new TftpServer())
{
server.OnReadRequest += new TftpServerEventHandler(server_OnReadRequest);
server.OnWriteRequest += new TftpServerEventHandler(server_OnWriteRequest);
server.Start();
Console.Read();
}

不确定我是否理解正确,但我相信 Console.Read() 会阻止应用程序退出。如果是这种情况,我将如何使用表单应用程序实现等效项。我只是无法理解“使用”。抱歉,我是 c# 的新手。

最佳答案

Windows 窗体将始终保持打开状态,直到它们被用户明确关闭。它们总是有一个线程读取用户输入的消息队列,因此它们不会像不受限制的控制台应用程序那样退出。在 Windows 窗体中,我们必须比在控制台应用程序中更多地担心多线程和并发性。它大多是自然发生的,但并非总是如此。

因此,您不能真正使用与 Console.Read() 等效的方法来推迟执行 using 处理,直到用户请求它。如果这样做,您的表单只会显得没有响应。

不过,你很幸运! C# 中的 using block 只不过是语法糖,用于记住在完成对象后调用 IDisposable.Dispose()。因此,在 Forms 项目中与此等效的方法可能只是将 server 对象存储在类范围的字段中,然后调用 server.Dispose() ,比如 Button.Click 事件。当然,这只是一个例子。如果感觉更合适,您也可以在 Form.Closing 上执行此操作。

高层,你想做这样的事情:

  1. 在表单类 TftpServer 服务器; 中声明一个字段。
  2. 注册一个 Load 事件以及您的 server 在构造函数中运行所需的任何内容。
  3. Form_Load 事件中打开您的 server 字段。
  4. Form 的生命周期中,按照您认为合适的方式使用服务器 的事件。您可能不必担心并发性,但这是另一个问题。
  5. 在表单的 Dispose 事件中调用 server.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;
}
}
}

关于c# - 不确定我是否在 tftp 应用程序中正确使用 "using"c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25070454/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com