【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;
        }
相关推荐
Mr.亮先生7 分钟前
Go语言实战:使用 excelize 实现多层复杂Excel表头导出教程
开发语言·golang·excel
web150854159359 分钟前
Python异步编程详解
开发语言·python
JCBP_9 分钟前
C++(3)
开发语言·c++·算法
Sandm。旧颜60913 分钟前
告别蜘蛛池!PHP 打造你的网站专属蜘蛛导航仪
开发语言·php
Thomas_YXQ20 分钟前
Unity3D HUD UI性能优化方案
开发语言·ui·搜索引擎·性能优化·全文检索·unity3d
是小菜呀!28 分钟前
一文讲清python、anaconda的安装以及pycharm创建工程
开发语言·python·pycharm
m0_7136963629 分钟前
python训练 60天挑战-day31
开发语言·人工智能·python·python学习打卡
哎呦你好1 小时前
CSS 选择器入门
开发语言·前端·css·html
asom221 小时前
Java 08集合
java·开发语言
独行soc1 小时前
2025年渗透测试面试题总结-安恒[实习]安全工程师(题目+回答)
运维·开发语言·经验分享·网络安全·面试·渗透测试·php