首页 > 后端开发 > C++ > 在 C# 中等待异步进程完成时如何避免 GUI 冻结?

在 C# 中等待异步进程完成时如何避免 GUI 冻结?

DDD
发布: 2025-01-04 22:05:41
原创
803 人浏览过

How Can I Avoid GUI Freezes When Waiting for Asynchronous Process Completion in C#?

使用 Process.WaitForExit() 异步进程完成

使用 Process.WaitForExit() 等待进程完成时,可能会遇到由于方法的阻塞性质而导致 GUI 冻结。为了解决这个问题,请考虑采用事件驱动的方法。

在 .NET 4.0 和 C# 5 中,异步模式为这个问题提供了一个优雅的解决方案。 WaitForExitAsync 扩展方法允许您异步等待进程退出。代码如下:

/// <summary>
/// Waits asynchronously for the process to exit.
/// </summary>
/// <param name="process">The process to wait for cancellation.</param>
/// <param name="cancellationToken">A cancellation token. If invoked, the task will return immediately as canceled.</param>
/// <returns>A Task representing waiting for the process to end.</returns>
public static Task WaitForExitAsync(this Process process, 
    CancellationToken cancellationToken = default(CancellationToken))
{
    if (process.HasExited) return Task.CompletedTask;

    var tcs = new TaskCompletionSource<object>();
    process.EnableRaisingEvents = true;
    process.Exited += (sender, args) => tcs.TrySetResult(null);
    if(cancellationToken != default(CancellationToken))
        cancellationToken.Register(() => tcs.SetCanceled());

    return process.HasExited ? Task.CompletedTask : tcs.Task;
}
登录后复制

用法:

public async void Test() 
{
   var process = new Process("processName");
   process.Start();
   await process.WaitForExitAsync();

   //Do some fun stuff here...
}
登录后复制

使用 WaitForExitAsync,您可以等待进程完成,而不会阻塞 GUI。它使用基于事件的方法在进程退出时通知调用代码,从而提供更具响应性和交互性的用户体验。

以上是在 C# 中等待异步进程完成时如何避免 GUI 冻结?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板