【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;
        }
相关推荐
不会C语言的男孩3 小时前
C++ Primer 第3章:字符串、向量和数组
开发语言·c++
兰令水3 小时前
leecodecode【反前后指针】【2026.5.31打卡-java版本】
java·开发语言
Dovis(誓平步青云)4 小时前
《QT学习第四篇:常见事件与UDP、TCP、文件系统、(锁、信号量、条件变量》
c语言·开发语言·汇编·qt
isyangli_blog13 小时前
OpenDayLight (Carbon 版本) 启动与组件安装
开发语言·php
vb20081113 小时前
FastAPI APIRouter
开发语言·python
Benszen13 小时前
KVM虚拟化解决方案
开发语言·perl
会编程的土豆13 小时前
Go 语言反射(Reflection)详解
开发语言·后端·golang
東雪木13 小时前
多线程与并发编程 专属复习笔记
java·开发语言·笔记·java面试
杨充13 小时前
1.3 浮点型数据设计灵魂
开发语言·python·算法
噜噜噜阿鲁~13 小时前
python学习笔记 | 11.3、面向对象高级编程-多重继承
java·开发语言