MY_*_*Y_G 1 c# visual-studio visual-studio-2017
我正在使用Visual Studio 2017。
每当我按下F5
开始调试程序时,我都会注意到该类Main(string[] args)
内部的方法Program
没有被调用,即使内部的字段Program
已初始化,您也可以从下面的屏幕截图中看到:
创建TcpClient
实例并将其分配给相应的字段后,调试器再也不会达到我在Main(string[] args)
方法上设置的断点。
可以肯定的是,我已将项目的启动对象设置为Program
类。那没有解决问题:
我想念什么?
编辑:
我已经Console.WriteLine("Entering Main method...")
在Main
方法中添加了内容,但是当我开始调试时它不会被打印到控制台中。
从字面上看,在TcpClient
创建实例之后,什么也没有发生(或者说,没有立即可见的东西)。该程序不会自行终止;控制台保持空白。
编辑:
事实证明,TcpClient
构造函数内部发生崩溃。
请记住,TcpClient(string, int)
构造函数此时会打开一个新连接(doc):
初始化TcpClient类的新实例,并连接到指定主机上的指定端口。
...
此构造函数创建一个新的TcpClient并尝试对提供的主机名和端口号进行同步连接。
如果我复制/粘贴您的代码(插入自己的代码RemoteServerIpAddressString
),那么在尝试构造时,我会看到该应用程序挂起TcpClient
。如果此时中断调试器,则可以看到它卡在了System.Net.Sockets.Socket.DoConnect
,它试图连接到远程计算机。
一段时间后,它放弃,引发异常,并TypeInitializationException
引发异常,这会破坏调试器。
这符合您的观察:
从字面上看,在创建TcpClient实例之后,什么也没有发生(或者,没有立即可见的东西)。该程序不会自行终止;控制台保持空白。
此时,TcpClient
仍在尝试连接。在成功之前,永远不会初始化类型,并且在这种情况发生Main
之前永远不会运行。如果您将其放置足够长的时间,它可能会像我的一样失败。
如果我确定s TcpClient
正在连接到开放的端口,则TcpClient
构造函数将立即完成并Main
运行。
在静态构造函数中执行长时间运行的操作(尤其是与网络有关的操作)是一个非常糟糕的主意。在初始化一个类型时,CLR需要获取一个锁,这会阻止其他类型的初始化,并可能导致死锁。
您可能想要构造TcpClient
内部Main
方法,或将其构造为:
private static readonly TcpClient TcpClient = new TcpClient();
Run Code Online (Sandbox Code Playgroud)
然后在主要:
TcpClient.Connect(...);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
77 次 |
最近记录: |