不确定我是否在tftp app中正确使用"使用"c#

Nim*_*jox 3 c# winforms tftp

我正在尝试使用这个预制的C#tftp服务器应用程序和我的windows c#表单.在作者服务器示例中,它运行良好,他使用控制台应用程序.当我尝试将他的控制台示例移植到我的表单应用程序时,它不起作用(没有错误,只是没有连接),我相信我的问题是在"使用"语句中:

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

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

Mat*_*gen 5

Windows窗体将始终保持打开状态,直到用户明确关闭它们.它们总是有一个线程读取消息队列以供用户输入,因此它们不会以无限制的控制台应用程序的相同方式退出.在Windows窗体中,我们不得不担心多线程和并发性,而不是在控制台应用程序中.它主要是自然而然的,但并非总是如此.

因此,在用户请求之前,您无法真正使用等效项Console.Read()来暂停执行using处理.如果你这样做,你的表单就会显得没有反应.

不过,你很幸运!usingC#中的一个块只不过是IDisposable.Dispose()在你完成一个对象之后记住调用的语法糖.所以相当于这一个表单项目可能仅仅是存储server在一个类范围的字段对象,然后调用server.Dispose(),比如说,一个Button.Click事件.当然,这只是一个例子.Form.Closing如果感觉更合适,你也可以这样做.

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

  1. 在表单类中声明一个字段TftpServer server;.
  2. 注册一个Load事件以及您server在构造函数中运行所需的任何内容.
  3. serverForm_Load活动中打开你的领域.
  4. server你的生命中,使用你认为合适的事件Form.您可能也可能不必担心并发问题,但这是另一个问题.
  5. 打电话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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)