gpt4 book ai didi

c# - 将Form.Owner设置为来自其他线程的表单

转载 作者:行者123 更新时间:2023-12-03 13:22:31 25 4
gpt4 key购买 nike

我的应用程序(C#,VS2008)通过网络从数据库(SQL Server 2008 Express)加载信息。在(可能)长时间等待期间,我希望有一个“正在加载...”对话框在不同的线程上运行,但前提是该操作花费的时间超过特定时间段(例如500毫秒)。

因此,到目前为止,我没有在500ms(如果操作持续了这么长时间)之后显示了我的加载表单,而没有设置加载对话框表单的所有者(即调用LoadingDialog.ShowDialog()),但是当我尝试调用LoadingDialog.ShowDialog(IWin32Window)时所有者),并将所有者设置为主要形式(通过线程的参数传递),我得到有关跨线程访问控件的InvalidOperationException。

我的基本问题是:我可以创建并使用拥有者参数设置为另一个线程上的表单的ShowDialog表单吗?我想这样做,以便加载对话框在应用程序的其余部分是模态的,即像其他任何对话框一样关注焦点并禁止在其他地方输入。

有人可以提出建议吗?我读过很多有关运气不佳的启动屏幕的信息,也有关于运气不佳的Invoke和BeginInvoke的信息。我应该采取其他方法吗?

如果您不明白,请随时要求澄清。

谢谢(正如他们用法语所说的),

雅各

最佳答案

您应该在后台线程中运行较长的过程,然后将“正在加载...”表单显示为非模式对话框。这样,用户可以看到“加载”指示,但在系统运行期间仍可与系统的其他部分进行交互。

另一个选择是在状态栏或类似栏中显示加载进度。关键是要确保长时间操作是在后台线程上完成的,而所有GUI逻辑都是在GUI线程上完成的。

良好的线程格式可能看起来像(出于演示目的,这只是伪代码-您需要使用Invoke来获取适当的线程):

RunInBackground(DoLongOperation);
ShowLoadingDialog();
...

DoLongOperation()
{
LongOperation();
RunOnGUI(FinishLongOperation);
}

FinishLongOperation()
{
CloseLoadingDialog();
}

关于c# - 将Form.Owner设置为来自其他线程的表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1660867/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com