C# 多线程异步--Token

1.代码部分

cs 复制代码
        private async void button4_Click(object sender, EventArgs e)
        {
            // 执行 FFmpeg 命令并等待其完成
            await RunFFmpegCommandAsync4(arguments);
        }
        private async Task RunFFmpegCommandAsync4(string args)
        {
            try
            {
                // 用于取消任务的Token
                CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
                CancellationToken token = cancellationTokenSource.Token;
 
                // 设置一个超时(例如10秒)
                int timeoutMilliseconds = 5 * 1000;
 
                // 设置 FFmpeg 可执行文件的完整路径
                string ffmpegPath = @"C:\ffmpeg\bin\ffmpeg.exe";  // 这里是 FFmpeg 可执行文件的完整路径
 
                // 创建进程启动信息
                ProcessStartInfo startInfo = new ProcessStartInfo
                {
                    FileName = ffmpegPath,  // 使用完整路径指定 FFmpeg 可执行文件
                    Arguments = args,//参数
                    RedirectStandardOutput = true,
                    RedirectStandardError = true,
                    UseShellExecute = false,
                    CreateNoWindow = true
                };
                // 在后台线程中执行 FFmpeg 命令
                using (Process process = new Process())
                {
                    process.StartInfo = startInfo;
                    try
                    {
                        process.Start();
 
                        // 启动任务来读取输出和错误流
                        Task<string> outputTask = Task.Run(() => process.StandardOutput.ReadToEnd(), token);
                        Task<string> errorTask = Task.Run(() => process.StandardError.ReadToEnd(), token);
 
                        // 等待直到任务完成,或者超时
                        //就是看这三个任务哪一个先完成
                        if (await Task.WhenAny(outputTask, errorTask,                     
                    Task.Delay(timeoutMilliseconds)) == Task.Delay(timeoutMilliseconds))
                        {
                            // 如果超时,取消任务
                            cancellationTokenSource.Cancel();
                            Debug.WriteLine("Process timed out and was cancelled.");
 
                            // 强制结束ffmpeg进程
                            process.Kill();
                            //假设你有一个 ffmpeg 进程,它在后台处理一个视频转换任务。
                            //你希望在 ffmpeg 执行时,程序依然能够做其他事情(比如,更新界面、监听用户输入等)。
                            //这时你可以使用 process.WaitForExitAsync() 来等待进程完成,而不会导致应用程序的界面冻结或卡死。
                            await process.WaitForExitAsync();//异步等待完成
                        }
                        else
                        {
                            // 如果任务完成,输出结果
                            string output = await outputTask;
                            string error = await errorTask;
 
                            Debug.WriteLine("Output: " + output);
                            Debug.WriteLine("Error: " + error);
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("Error: " + ex.Message);
                    }
                    finally
                    {
                        if (!process.HasExited)
                        {
                            // 如果进程没有退出,强制结束
                            process.Kill();
                            await process.WaitForExitAsync();
                            Console.WriteLine("Process was manually killed.");
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"执行 FFmpeg 命令失败: {ex.Message}");
            }
        }
相关推荐
2601_966949654 小时前
如何根据研究的起止时间截取分钟级行情?Python 实战与 QuantDash 数据处理指南
开发语言·python·pandas·量化交易·1024程序员节·股票数据·quantdash
晨曦中的暮雨6 小时前
限流算法——固定窗口、滑动窗口、漏桶、令牌桶
java·开发语言·算法
喵了几个咪6 小时前
GoWind CMS 拆解:在 Go 里给 TipTap 搭一套 Yjs 协同后端
开发语言·后端·golang
程序员清风6 小时前
数据处理脚本工程化:日志、配置、命令行与测试
服务器·开发语言·数据库
淡海水8 小时前
07-02-源码-.NET Core GC分配路径
算法·unity·c#·.netcore·gc·1024程序员节
2601_962885728 小时前
如何用 Python 把 K 线重采样成任意周期?
开发语言·python
Wang's Blog9 小时前
Java 项目实战: 交友项目 - 圈子功能实现:总结
java·开发语言·交友
下一站春风里9 小时前
位运算完整学习笔记:按位与(&)+ 异或(^)
开发语言·c++·算法
吴可可12310 小时前
C#调用摄像头拍照的三种API方案
c#
天外飞雨道沧桑10 小时前
我在浏览器里练了一个 792 参数的大模型,它学会了补全 JavaScript
开发语言·javascript·ai·ecmascript·ai编程