C# Application.Run()表单未显示
我目前正在用C#编写一个小型Web服务。 当我启动它时,我希望它做的唯一一件事就是显示一个小GUI,并立即打开一个等待传入请求的TCP连接,然后这些请求应该被记录到GUI并由C 问题是,当我启动应用程序时,我没有得到表单,没有控制台,什么都没有 像往常一样,表单由C# Application.Run()表单未显示,c#,winforms,constructor,C#,Winforms,Constructor,我目前正在用C#编写一个小型Web服务。 当我启动它时,我希望它做的唯一一件事就是显示一个小GUI,并立即打开一个等待传入请求的TCP连接,然后这些请求应该被记录到GUI并由C 问题是,当我启动应用程序时,我没有得到表单,没有控制台,什么都没有 像往常一样,表单由Application.Run(newform1())实例化 我的构造函数看起来是这样的,因为我希望应用程序立即打开TcpConnection public Form1() { InitializeCom
Application.Run(newform1())实例化代码>
我的构造函数看起来是这样的,因为我希望应用程序立即打开TcpConnection
public Form1()
{
InitializeComponent();
startTcpConn();
}
我有一种感觉,等待连接会在某种程度上阻碍我表单的显示:(
我还试图用一个超时来启动TcpConn,但没有用。
进程在后台运行(正如您可以在任务管理器中看到的,但您无法看到表单。未处于调试或发布模式,甚至在没有VS.的情况下启动它。异步运行TCP连接方法的最简单方法是启动一个新任务。这将运行一个新操作,并立即将控件返回到构造函数,该构造函数现在可以完成。
public Form1()
{
InitializeComponent();
Task.Run( ()=>startTcpConn() );
}
您需要确保来自新线程的所有UI操作都将在UI线程上运行,否则您迟早会遇到跨线程异常。我不确定什么是startTcpConn
,但我猜它会打开连接并等待接收网络数据。这基本上意味着你正在“暂停”UI线程,你不让它处理UI,所以它不会显示任何内容
您应该更改代码,使其在不同的线程上工作,并在加载表单后等待执行该操作:
public Form1()
{
InitializeComponent();
}
public void Form1_loaded(object sender, EventArgs e)
{
Task.Run(() => startTcpConn());
}
你的感觉是对的。现在打开连接还为时过早。你还需要使用某种异步模式。我已经编辑了你的标题。请参见“”,其中共识是“不,他们不应该”。显示startTcpConn();
方法。异步执行连接操作有几个选项。感谢您的提示,这与表单事件“Showed”结合在一起非常有效。我可以看到我的UI:)但是,正如您所说,我现在无法从另一个任务中修改表单的元素。事件或工作人员是否仍然可以使用我的startTcpConn方法修改表单的元素?@user2334932您不能从ThreaPool线程更改UI控件。您需要使用Invoke让UI线程为您进行更改。下面是我的答案t写信给某人: