前言: 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;
}