【WPF 按钮点击后异步上传多文件code示例】

前言: WPF中按钮点击事件如何执行时间太长会导致整个UI线程卡顿,现象就是页面刷新卡住,点击其他按钮无反馈。如下是进行异步执行命令,并远程上传文件的代码。
c 复制代码
// 这里对于长时间执行的任务,必须使用异步方法进行处理
        private async void SaveCameraConfig(object obj)
        {
            SystemModel device = SystemModel.GetGlobalInstance();
            int robotindex = device.SelectedRobotIndex;
            string selectRobotIp;
            string temp;
            if (!Directory.Exists(hostFilePath))
            {
                temp = "相机本地配置文件夹不存在,请检查!";
                Growl.Error(temp, _token);
                return;
            }
            if (!device.robotIdToIpDict.TryGetValue(robotindex, out selectRobotIp))
            {
                temp = "Robot " + (robotindex + 1) + " not connected yet, load faliure!";
                Growl.Error(temp, _token);
                return;
            }
            Task<bool> task = Task.Run(() => ExecuteLongProcedure(this, selectRobotIp, remoteFilePath, hostFilePath, userName, passWord));
            await Task.WhenAll(task);
            bool result = task.Result;
            if (result)
            {
                device.LoadCameraConfigFlag = true;
                temp = "相机配置文件加载成功!";
                Growl.Success(temp, _token);
            } else {
                temp = "相机配置文件传输失败!";
                Growl.Error(temp, _token);
            }
        }

        private bool ExecuteLongProcedure(object context, string selectRobotIp, string remoteFolderPath, string hostFolderPath, string userName, string passWord)
        {
            bool transferFlag = true;
            string temp;
            string[] filePaths = Directory.GetFiles(hostFolderPath);
            foreach (string filepath in filePaths)
            {
                string filename = Path.GetFileName(filepath);
                // 网络摄像头分组A的配置文件均进行发送
                if (!filename.EndsWith("Group0.config"))
                {
                    continue;
                }
                string remoteFilePath = $"{remoteFolderPath}/{filename}";
                using (var client = new SftpClient(selectRobotIp, userName, passWord))
                {
                    try
                    {
                        client.Connect();
                        using (var fileStream = new FileStream(filepath, FileMode.Open))
                        {
                            client.UploadFile(fileStream, remoteFilePath);
                        }
                    }
                    catch (Exception ex)
                    {
                        transferFlag = false;
                        temp = filename + $"文件传输失败:{ex.Message}";
                        Growl.Error(temp, _token);
                        return false;
                    }
                    finally
                    {
                        if (client.IsConnected)
                        {
                            client.Disconnect();
                        }
                    }
                }
            }
            return transferFlag;
        }
相关推荐
Dxy12393102165 小时前
Python 使用正则表达式将多个空格替换为一个空格
开发语言·python·正则表达式
故事和你916 小时前
洛谷-数据结构1-1-线性表1
开发语言·数据结构·c++·算法·leetcode·动态规划·图论
techdashen7 小时前
Rust项目公开征测:Cargo 构建目录新布局方案
开发语言·后端·rust
星空椰7 小时前
JavaScript 进阶基础:函数、作用域与常用技巧总结
开发语言·前端·javascript
忒可君8 小时前
C# winform 自制分页功能
android·开发语言·c#
Rust研习社8 小时前
Rust 智能指针 Cell 与 RefCell 的内部可变性
开发语言·后端·rust
leaves falling8 小时前
C++模板进阶
开发语言·c++
坐吃山猪9 小时前
Python27_协程游戏理解
开发语言·python·游戏
gCode Teacher 格码致知9 小时前
Javascript提高:小数精度和随机数-由Deepseek产生
开发语言·javascript·ecmascript
椰猫子9 小时前
Javaweb(Filter、Listener、AJAX、JSON)
java·开发语言