首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当进程为WaitForExit()时,WPF应用程序被卡住

当进程为WaitForExit()时,WPF应用程序被卡住是因为WaitForExit()方法会阻塞当前线程,直到关联的进程退出为止。在WPF应用程序中,UI线程负责处理用户界面的更新和响应,当UI线程被阻塞时,应用程序会出现卡顿或无响应的情况。

为了解决这个问题,可以将进程的等待操作放在后台线程中执行,以避免阻塞UI线程。可以使用Task或Thread类来创建后台线程,并在该线程中执行进程的等待操作。

以下是一个示例代码,展示了如何在后台线程中执行进程的等待操作:

代码语言:csharp
复制
using System.Diagnostics;
using System.Threading.Tasks;

// 创建后台线程执行进程等待操作
Task.Run(() =>
{
    Process process = new Process();
    process.StartInfo.FileName = "your_process.exe";
    process.Start();
    process.WaitForExit();
    // 在进程退出后执行其他操作
    // ...
});

在上述示例中,通过Task.Run()方法创建了一个后台线程,并在该线程中执行进程的启动和等待操作。这样可以确保UI线程不会被阻塞,从而保持应用程序的响应性。

需要注意的是,在后台线程中无法直接更新UI元素,如果需要更新UI,可以使用Dispatcher.Invoke()方法将更新操作派发到UI线程执行。

此外,还可以考虑使用异步的方式执行进程等待操作,以避免阻塞UI线程。可以使用async/await关键字结合Process.WaitForExitAsync()方法来实现异步等待进程退出。

总结起来,当进程为WaitForExit()时,WPF应用程序被卡住的解决方法是将进程的等待操作放在后台线程中执行,或者使用异步的方式执行进程等待操作,以避免阻塞UI线程。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

使用C#简单制作一个看门狗程序

摘要 在有些特殊项目中,软件可能是无人值守的,如果程序莫名其妙挂了或者进程干掉了等等,这时开发一个看门狗程序是非常有必要的,它就像一只打不死的小强,只要程序非正常退出,它就能立即再次将被看护的程序启动起来...代码实现 Tips:文末有完整源代码,就不一步一步写了 1、创建一个Dog类,主要用于间隔性扫描看护程序是否还在运行 开了个定时器,每5秒去检查1次,如果没有找到进程则使用Process启动程序 public...NotifyIcon icon = new NotifyIcon(); private static Dog dog = new Dog(); /// /// 应用程序的主入口点...} } 3、简单实现个日志记录器(使用第三方库也行,建议看护程序最好不要有任何依赖),也可直接使用我下面这个,很简单,无任何依赖 public class Log { //读写锁,资源处于写入模式...; MainWindow mainWindow = new MainWindow(); app.Run(mainWindow); } } Winform、普通WPF

87320

【.net 深呼吸】启动一个进程并实时获取状态信息

类型是Writer,为啥是writer呢,因为这个标准流是相对于启动的进程而言的,流动方向是从调用方流向目标进程,所以是写入数据,即将内容发送到目标进程。 StandardOutput——输出流。...首先完成调用的项目,项目类型Windows应用程序项目。 ? 不管它,反正就是一个标准的.exe文件,这个项目我是先建个空白项目,然后手动设置的。 每个可执行程序都必须至少有一个Main方法。...最后那一行Environment.ExitCode = 0 表示进程退出返回退出码0,即正常退出。因为我这个Main是返回void的,所以要用Enviroment类的ExitCode来设置。...好,调用进程项目完成,现在做调用者项目,它是一个WPF项目。在这个时代,写Windows桌面应用都应优先用WPF,因为WPF是牛逼层面的东东。 XAML代码就不贴了,直接讲核心代码。...本来,是可以调用 System.Diagnostics.Process.WaitForExit()方法来等待进程执行完的,但是,由于这个方法是同步调用的,它会让UI线程塞车,导致UI无法即时响应,体验不好

96560
  • Service Mesh深度学习系列|istio源码分析之pilot-agent组件分析

    接下来马上就会重启abort的envoy)。...ctx.Done:执行agent.terminate terminate方法比较简单,向所有的envoy进程的abortCh发出errAbort消息,造成他们全体kill(Cmd.Kill),然后agent...但是如果有envoy进程异常退出,它对应的序列号并非是最大的情况下,这个空出来的序列号不会在计算下一个新的epoch序列号(agent.latestEpoch方法负责计算当前最大的epoch序列号)优先使用...也就是万一想要abort某个envoy进程,但是envoy卡住了abort不了,有buffer的话,就不会使得管理进程卡住。...启动另外一个进程运行envoy,然后waitForExit负责监听abortCh和envoy进程执行结果。

    1.3K00

    加强版在国内分发 UWP 应用正确方式 通过win32安装UWP应用

    本文告诉大家如何使用传统的方法,将 UWP 作为 win32 应用安装包方法分发给用户安装 将 UWP 作为安装包的方式分发也就是通过旁加载的方式,而微软干的不错的使用旁加载如果使用的证书不清真,那么就要求用户信任证书...然后再写一个安装界面程序,安装界面程序可以和安装程序是两个进程,这样安装界面可以用很漂亮的 WPF 写,作出有趣的动画。...因为所有 UWP 只能在 win10 运行,而 win10 系统自带 .NET 4.7 所以可以放心使用 WPF 程序。...process.StandardOutput; Console.WriteLine(processStandardOutput.ReadToEnd()); process.WaitForExit...processStartInfo); Console.WriteLine(process.StandardOutput.ReadToEnd()); process.WaitForExit

    1K10

    使用GeneralUpdate实现.NET客户端程序自动更新

    本文所述的自动更新技术主要使用了开源的GeneralUpdate组件,可用于Winform/WPF/ConsoleApp等应用程序的自动更新。...客户端从服务端获取到待更新文件的路径,需要通过进程间通信启动更新组件,更新组件启动后需要关闭客户端程序以防止某些文件被占用导致更新失败。...笔者用的文件服务器是HFS,下载地址:HFS下载。 代码结构剖析 上图中以GeneralUpdate开头的工程是自动更新功能的核心代码,在nuget服务器上能看到各个工程的包。...try { process.Kill(); process.WaitForExit...这里通过管理员权限启动更新组件,以免更新失败(组件在更新需要把文件拷贝到系统的临时目录,更新成功后删除,权限不足时会出错)。

    1.5K10

    WPF桌面端开发-音视频录制(使用ffmpeg.exe实现)

    return defaultLoopbackCaptureDevice.AudioEndpointVolume.MasterVolumeLevelScalar; }这个方法主要用于麦克风和扬声器混音,...但是下面的方式有个问题在Win7系统上,FFmpeg有问题,获取到的音频设备的名称过长的话就会被截取,而NAudio获取到的名称是完整的,导致传入完整的设备名称进行录制的时候,反而ffmpwg找不到设备,必须传截取后的名称...mProcess.Start(); //启动线程 mProcess.WaitForExit(); //阻塞等待进程结束 mProcess.Close...mProcess.Start(); //启动线程 mProcess.WaitForExit(); //阻塞等待进程结束...IsFfmpegInstalled() { return GetFFmpegVersion() == "6.0"; }下载FFmpeghttps://www.psvmc.cn/article/2020-02-04-wpf-start

    68420

    如何让Java应用成为杀不死的小强?(中篇)

    上期我们抛了一个砖:“如何实现 Java 应用进程的状态监控,如果监控的进程 down 掉,是否有机制能启动起来?”并结合 Resin 应用服务器背后启动的进程,更详细的阐述了一下问题。...一目了然根据传入参数创建 Resin 实例,然后重点关注一下 waitForExit,这个是不是和咱们猜测的丫鬟进程与大总管进程通讯不上就退出,是不是这么回事呢? ?...),然后调用 waitForExit 方法。...源码看了七七八八,细枝末节没细谈,主要是能明白梗概,梳理个大致脉略,能大致清晰 Resin 服务启动启动了 ResinBoot 进程、WatchdogManager 进程、Resin 进程进程启动完成后...ResinBoot 进程就正常退出了,所以当我们用 jps 命令看,就发现只有 WatchdogManager、Resin 两个进程啦,其中用到的核心技术 ProcessBuilder、Socket

    68410

    WPF 高性能笔

    如果需要等待主界面的布局也就是如果主线程卡住了,就需要等待主线程才可以渲染。 所以按照原来的元素的输入渲染是无法做到高性能的,那么 WPF 的笔迹是如何做到很快?...这里判断命中测试和 WPF 说的命中测试使用的不是同相同的方法,这里只是简单获取每个界面元素的矩形,然后用触摸的点坐标判断是否在这个矩形内,也就是不判断元素是否其他的元素挡住。...在 WPF 的 笔迹是没有额外创建一个线程作为另一个 UI 线程,而是直接将触摸收集线程作为另一个 UI 线程。当然这个方法如果没用好可能就会在用户多个手指书写无法做到足够高的速度。...需要知道 StylusPlugIn 提供了底层的触摸事件,这个事件从 Wisp 进程获得数据然后直接给框架,然后给 UIElement 所以继承StylusPlugIn可以拿到比路由事件更快。...如果需要加入到 StylusPlugIn 首先需要继承 StylusPlugIn 先创建一个类 TtkSwvlypxm 继承 StylusPlugIn ,那么可以通过重写获得 OnAdded 添加

    75740

    WPF的消息机制(一)- 让应用程序动起来

    WPF大部分的对象都是从DispatcherObject派生的,从这里派生的对象具有一个明显的特征,那就是:修改对象所在的线程,和创建对象所在线程必须同一个线程,这就是微软所谓的线程亲缘性(Thread...通过调用堆栈可以看出,蓝色的部分是启动了一个线程,VisualStudio在Host的进程当中运行当前应用程序;红色的部分是从Application.Main函数开始执行,经过几个函数到达Dispatcher.Run...对了,这就是WPF应用程序进入了消息循环。...这样以来,任何需要应用程序处理的消息通过这个过程,不同的窗口处理了,应用程序就动起来了。...开发工具 ComponentOne Studio WPF 是专为桌面应用程序开发所准备的一整套控件包,崇尚优雅和创新,以“触控优先”设计理念,内含轻量级高性能表格控件,和大量类型丰富的2D和3D图表控件

    1.4K90

    WPF 高性能笔

    如果需要等待主界面的布局也就是如果主线程卡住了,就需要等待主线程才可以渲染。 所以按照原来的元素的输入渲染是无法做到高性能的,那么 WPF 的笔迹是如何做到很快?...这里判断命中测试和 WPF 说的命中测试使用的不是同相同的方法,这里只是简单获取每个界面元素的矩形,然后用触摸的点坐标判断是否在这个矩形内,也就是不判断元素是否其他的元素挡住。...在 WPF 的 笔迹是没有额外创建一个线程作为另一个 UI 线程,而是直接将触摸收集线程作为另一个 UI 线程。当然这个方法如果没用好可能就会在用户多个手指书写无法做到足够高的速度。...需要知道 StylusPlugIn 提供了底层的触摸事件,这个事件从 Wisp 进程获得数据然后直接给框架,然后给 UIElement 所以继承StylusPlugIn可以拿到比路由事件更快。...如果需要加入到 StylusPlugIn 首先需要继承 StylusPlugIn 先创建一个类 TtkSwvlypxm 继承 StylusPlugIn ,那么可以通过重写获得 OnAdded 添加

    43030

    将浏览器嵌入 .NET 应用程序中:DotNetBrowser 还是 CefSharp?

    WPF 或 WinForms 应用程序选择浏览器组件,对于那些搜索基于Chrome的解决方案的人来说, DotNetBrowser[1]和CefSharp[2]是最明显的选择。...AnyCPU 在针对 AnyCPU 的应用程序中使用 CefSharp ,您会发现它在这些应用程序的 64 位环境中无法正常工作。 这儿有几个选项[7]可以解决这个问题。...它可以像任何其他常规 UI 控件一样拖到窗体或窗口上。 嵌入应用程序 UI CefSharp 提供 WPF 和 Windows 窗体支持。但是,它的 WPF 实现只能在离屏渲染模式[13]下工作。...DLL 打包应用程序的一部分,并确保 CefSharp 正确找到它们。...概括 因为开源和免费,CefSharp 广泛使用。它很容易基本案例进行配置,并且拥有广泛的文档和活跃的开源开发者社区。 但是,它具有来自其设计和架构的限制。

    54120

    使用Process的StandardInput与StandardOutput写入读取控制台数据

    本文原创文章、源代码原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称、作者及网址,谢谢!...; 2)输出“Test”(不管大小写),则输出: You have type correctly. Congratulation! 3)输出其他,则输出: Sorry,Uncorrectly!...以上是必备的应用程序,如果不使用该程序,可以使用System32文件夹下的cmd.exe来当做控制台应用程序; 二、将以上生成的程序Test.exe拷贝到D盘根目录下; 三、新建一个控制台应用程序(MainConsoleApp...:要重定向 IO流,Process对象必须将 UseShellExecute属性设置false; ProcessStartInfo.CreateNoWindow:是否以没有窗体的模式创建应用程序,默认为...false,即有窗体,如true,即隐藏窗体。

    3K00

    支持 Windows 10 最新 PerMonitorV2 特性的 WPF 多屏高 DPI 应用开发

    添加应用程序清单文件 在你现有 WPF 项目的主项目中需要添加两个文件以支持第二代的多屏 DPI 机制。...image.png ▲ 新建文件的时候选择应用程序清单文件(应用程序配置文件就在旁边) 了解 WPF 清单文件中的 DPI 感知设置 DpiAware 在你打开了 app.manifest 文件后,找到以下代码...包含 true 字符串 当前进程设置系统级 DPI 感知(System DPI Awareness)。...,而 WPF 区域(客户区) DPI 虚拟化进行了位图拉伸(模糊)。...dpiAwareness 设置 PerMonitorV2: image.png ▲ 150% DPI 注意到标题栏(非客户区)缩放了,而 WPF 区域(客户区)也能清晰地缩放(仅 Windows

    1.7K31

    System.InvalidOperationException:“寄宿 HWND 必须是子窗口。”

    试图在 WPF 窗口中嵌套显示 Win32 子窗口的时候,你有可能出现错误:“System.InvalidOperationException:“寄宿 HWND 必须是子窗口。””。...一般情况下我们当然不会这么去做,但是如果我们要跨越进程边界来完成 WPF 渲染内容的融合的时候,就需要嵌入一个新的窗口了。...由于窗口句柄是可以跨越进程边界传递的,所以这样的方式可以完成跨进程WPF 控件显示。 下面是最简单的一个例子,为了简单,没有跨进程传递 Win32 窗口句柄,而是直接创建出来。...,也就是设置 WindowStyle WS_CHILD; 需要设置此窗口的父窗口,也就是设置 ParentWindow hwndParent.Handle(我们使用参数中传入的 hwndParent...WPF嵌入式调用Win32应用程序的问题—提示异常:寄宿的HWND必须是指定父级的子窗口 本文会经常更新,请阅读原文: https://blog.walterlv.com/post/hosted-hwnd-must-be-a-child-window.html

    34820
    领券