前言: WPF中按钮点击事件如何执行时间太长会导致整个UI线程卡顿,现象就是页面刷新卡住,点击其他按钮无反馈。如下是进行异步执行命令,并远程上传文件的代码。
![异步上传文件](https://img-blog.csdnimg.cn/direct/20c071929b004dcf9223dee2a6364c64.png
// 这里对于长时间执行的任务,必须使用异步方法进行处理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.BufferSize = 1024;client.Connect();using (var fileStream = new FileStream(filepath, FileMode.Open)){client.UploadFile(fileStream, remoteFilePath);}}catch (Exception ex){transferFlag = false;temp = filename + $"文件传输失败:{ex.Message}";Growl.Warning(temp, _token);return false;}finally{if (client.IsConnected){client.Dispose();// 此处断连后一定sleep一会儿再重新连接,否则会提示超时Thread.Sleep(200);}}}}return transferFlag;}