【问题标题】:Application.Run() Form not displayingApplication.Run() 表单不显示
【发布时间】:2014-01-12 09:32:31
【问题描述】:

我目前正在用 C# 编写一个小的 Web 服务。 当我启动它时,我唯一想让它做的就是向我显示一个小 GUI,并立即为传入的请求打开一个等待的 TcpConnection,然后应该将其记录到 GUI 并被处理...

问题是,当我启动应用程序时,我没有得到任何表单,没有控制台,什么都没有......

像往常一样,Application.Run(new Form1()); 正在实例化表单

我的构造函数看起来像这样,因为我希望应用程序立即打开 TcpConnection...

    public Form1()
    {
        InitializeComponent();
        startTcpConn();
    }

我有一种感觉,等待连接以某种方式阻止了我的表单的显示:(

我还尝试用超时启动 TcpConn,但没有帮助。 该进程在后台运行(正如您在任务管理器中看到的那样,但您看不到表单。不在调试或发布模式下,甚至在没有 VS 的情况下启动它...

【问题讨论】:

  • 你的感觉是对的。现在打开连接还为时过早。您还需要使用某种异步模式。
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • 显示startTcpConn(); 方法。有几个选项可以异步执行连接操作。

标签: c# winforms constructor


【解决方案1】:

异步运行 TCP 连接方法的最简单方法是启动一个新任务。这将运行一个新操作并立即将控件返回给构造函数,该构造函数现在能够完成。

public Form1()
{
    InitializeComponent();
    Task.Run( ()=>startTcpConn() );
}

您需要确保来自新线程的所有 UI 操作都将在 UI 线程上运行,否则您迟早会遇到跨线程异常。

【讨论】:

    【解决方案2】:

    我不确定startTcpConn 是什么,但我猜它会打开一个连接并等待接收网络数据。这基本上意味着您正在“暂停” UI 线程并且您不让它处理 UI,因此它不会显示任何内容。

    你应该改变你的代码,让它在不同的线程上工作,并在表单加载后等待:

    public Form1()
    {
        InitializeComponent();
    }
    
    public void Form1_loaded(object sender, EventArgs e)
    {
        Task.Run(() => startTcpConn());
    }
    

    【讨论】:

    • 感谢您的提示,这与“显示”表单事件相结合非常有效。我可以看到我的 UI :) 但正如你所说,我现在无法从其他任务中修改我的表单元素。是否还有一种方法可以让事件或工作人员使用我的 startTcpConn 方法修改表单的元素?
    • @user2334932 您无法从 ThraPool 线程更改 UI 控件。您需要使用 Invoke 让 UI 线程为您进行更改。这是我刚刚写给某人的答案:stackoverflow.com/a/21070045/885318
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 2018-05-18
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 2018-10-02
    相关资源
    最近更新 更多