在线程中显示一个窗口(多个UI线程)

多数耗时操作可以异步执行,推荐async/await。

但和UI相关的部分仅能在UI线程执行,这时UI线程的耗时操作,导致界面卡死,不够友好。

我们可以创建一个单独的UI线程显示一个正在加载的窗口,可以在窗口显示一些动画之类的。

如果是WinForms那么很容易做到。

Application.Run(new LoadingForm());

WPF没有提供这样简单的方式,官方文档中有示例《多窗口、多线程》,官方例子 ExceptionHandlingSecondaryUIThread

经过简化后,十几行代码就可以实现。

 1         private void 单独UI线程_Click(object sender, RoutedEventArgs e)
 2         {
 3             LoadingWindow loadingWindow = null;
 4             var thread = new Thread(() =>
 5             {
 6                 loadingWindow = new LoadingWindow();
 7                 loadingWindow.Show();
 8                 System.Windows.Threading.Dispatcher.Run();
 9             });
10             thread.SetApartmentState(ApartmentState.STA);
11             thread.Start();
12             耗时操作();
13             loadingWindow.Dispatcher.Invoke(() => loadingWindow.Close());
14             loadingWindow.Dispatcher.InvokeShutdown();
15         }

完整代码在我的 GitHub

原文地址:https://www.cnblogs.com/noctwolf/p/11216386.html

时间: 2024-11-10 04:19:42

在线程中显示一个窗口(多个UI线程)的相关文章

Excel在任务栏中只显示一个窗口的解决办法

Excel在任务栏中只显示一个窗口的解决办法 以前朋友遇到过这个问题,这次自己又遇到了,习惯了以前的那种在任务栏中显示全部窗口,方便用Alt+Tab键进行切换. 如果同时打开许多Excel工作簿,在桌面任务栏中通常会显示多个工作簿窗口按钮.如果任务栏只中显示了一个Excel窗口按钮,所有的工作簿窗口只出现在Excel程序窗口内部,可能是相关的设置被改动了,可以通过下面方法改回设置: 在Excel 2003中单击菜单“工具→选项”,选择“视图”选项卡,选择“任务栏中的窗口”. 在Excel 200

在多线程中显示模态窗口,出现异常现象

无意间发现如果在多线程中显示模态窗口后,当这个模态窗口关闭后,原来的主窗口无法再次响应鼠标事件了. 就是窗口上的按钮用鼠标点击没反应,整个窗口看上去像是禁用的状态. 具体原因到现在没找到. 最后的解决办法: 在多线程中,使用 SendMessage() 发送一个[用户自定义消息], 然后由UI线程来接收,并显示模态窗口,这个时候当模态窗口关闭后,主窗口还是处于激活的状态,窗口上的按钮可以正常点击和响应. 同时我发现,如果在多线程中,调用 MessageBox() 来弹出模态对话框,当关闭对话框后

Android在非UI线程中显示Toast

[java] view plaincopyprint? public void showToast(String msg){ Looper.prepare(); Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show(); Looper.loop(); } public void showToast(String msg){ Looper.prepare(); Toast.makeText(getApplicat

C# 在winform或者wpf中显示控制台窗口

这儿需要使用两个系统函数: BOOL WINAPI FreeConsole(void); //// 关闭控制台窗口,参考:http://msdn.microsoft.com/en-us/library/ms683150%28VS.85%29.aspx BOOL WINAPI AllocConsole(void); //// 打开控制台窗口,参考:http://msdn.microsoft.com/en-us/library/ms681944%28VS.85%29.aspx对应DLL:Kernel

VC 在子线程中结束主窗口程序

在MFC 中,创建一个子线程,若想在子线程中退出主窗口程序,可使用PostMessage 向主窗口发送close 或者quit 消息. BOOL CHandBoxComDlg::OnInitDialog() { g_pThread= AfxBeginThread(ThreadRdFromHandBox, (LPVOID)this); } UINT ThreadRdFromHandBox(LPVOID pParam) { CHandBoxComDlg* pParent=(CHandBoxComDl

C#中只使用Invokerequired来判断是不是UI线程可靠吗?

博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:C#中只使用Invokerequired来判断是不是UI线程可靠吗?.

[Android Pro] service中显示一个dialog 或者通过windowmanage显示view

转载: http://blog.csdn.net/huxueyan521/article/details/8954844 通过windowmananger来在窗口上添加view的时候,需要设置alert参数,而且要添加alert权限 mLayoutParams = new WindowManager.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, LayoutParams.TYPE_SYSTEM_ALERT,

034在屏幕中显示一个工具条

效果如下: ViewController.h 1 #import <UIKit/UIKit.h> 2 3 @interface ViewController : UIViewController 4 @end ViewController.m 1 #import "ViewController.h" 2 3 @interface ViewController () 4 - (void)nextDidPush; 5 @end 6 7 @implementation ViewC

059在屏幕中显示一个文本输入框

效果如下: ViewController.h 1 #import <UIKit/UIKit.h> 2 3 @interface ViewController : UIViewController 4 @property (strong, nonatomic) UITextField *txtFMessage; 5 6 @end ViewController.m 1 #import "ViewController.h" 2 3 @interface ViewControlle