C#WinForms子窗体在Show()后未重新绘制

C#WinForms子窗体在Show()后未重新绘制,c#,.net,winforms,C#,.net,Winforms,我正在开发一个C#WinForms应用程序,我希望它能够弹出并打开一个非模式对话框,该对话框将被重新绘制,并与主窗口/窗体同时交互 主窗口使用SerialPort并显示数据传输计数,这些计数通过SerialDataReceivedEventHandler不断增加 我可以使用ShowDialog(),它似乎以模态方式工作,但在使用对话框时主窗口数据计数器会冻结,我认为最终串行缓冲区会溢出 我想我想使用Show(),但如果我这样做了,对话框会显示在屏幕上,半开半闭,然后就不再被绘制或交互了(如果我在

我正在开发一个C#WinForms应用程序,我希望它能够弹出并打开一个非模式对话框,该对话框将被重新绘制,并与主窗口/窗体同时交互

主窗口使用SerialPort并显示数据传输计数,这些计数通过SerialDataReceivedEventHandler不断增加

我可以使用ShowDialog(),它似乎以模态方式工作,但在使用对话框时主窗口数据计数器会冻结,我认为最终串行缓冲区会溢出

我想我想使用Show(),但如果我这样做了,对话框会显示在屏幕上,半开半闭,然后就不再被绘制或交互了(如果我在对话框上拖动另一个窗口,它就会被破坏)。它一直在屏幕上,直到我关闭主应用程序窗口

也许我应该开始另一个线程,或者,很可能,我只是做错了什么。我通常不做C#或Windows编程(也许你可以告诉我)

评论后编辑(谢谢评论):

我想也许大多数事情都是在调用串行接收事件处理程序的任何线程下运行的。启动我的应用程序时,我创建了一个类来处理序列号,其中包括:

com.DataReceived += new SerialDataReceivedEventHandler(SerialRxHandler);
我编写的唯一关心线程的代码是一些更新计数器和日志列表框的函数,我发现这些函数必须使用一些invoker进行包装,以防止我收到关于线程切换的投诉:

delegate void SetCountDelegate(TextBox tb, int count);
internal void SetCount(TextBox tb, int count) {
    // thread switch magic
    if (InvokeRequired) {
        BeginInvoke(new SetCountDelegate(SetCount), new object[] { tb, count });
    } else {
        tb.Text = String.Format("{0}", count);
    }
}

所以也许我不应该在这个线程上显示()表单。另一个invokererequired块,或者我应该完全不同地做事情吗?

假设我会回答自己


在评论和思考的提示下,我做了一个Invoke()来切换到UI线程,然后尝试创建并显示()我的子对话框。成功了。

你能发布你的代码吗。您正在从UI线程上的串行端口读取数据吗?关于需要使用
Show
而不是
ShowDialog
,您是对的,但您可能不应该尝试从多个线程更新UI。你能发布你的代码让我们看看是什么导致你的应用程序冻结吗?您可能需要将串行端口访问转到单独的线程上。