我正在尝试使用这个预制的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#的新手.
Windows窗体将始终保持打开状态,直到用户明确关闭它们.它们总是有一个线程读取消息队列以供用户输入,因此它们不会以无限制的控制台应用程序的相同方式退出.在Windows窗体中,我们不得不担心多线程和并发性,而不是在控制台应用程序中.它主要是自然而然的,但并非总是如此.
因此,在用户请求之前,您无法真正使用等效项Console.Read()来暂停执行using处理.如果你这样做,你的表单就会显得没有反应.
不过,你很幸运!usingC#中的一个块只不过是IDisposable.Dispose()在你完成一个对象之后记住调用的语法糖.所以相当于这一个表单项目可能仅仅是存储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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
403 次 |
| 最近记录: |