下载耗时太久,异步操作

This commit is contained in:
2025-05-29 16:39:05 +08:00
parent a5f6a79a34
commit 4cbb3955a4
3 changed files with 2982 additions and 2940 deletions

View File

@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<OutputType>Exe</OutputType> <OutputType>WinExe</OutputType>
<TargetFramework>net6.0-windows</TargetFramework> <TargetFramework>net6.0-windows</TargetFramework>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>

View File

@@ -26,6 +26,7 @@ using CapMachine.Model.MeterConfig;
using Masuit.Tools; using Masuit.Tools;
using System.Timers; using System.Timers;
using Prism.Events; using Prism.Events;
using System.Windows.Threading;
namespace CapMachine.Wpf.Services namespace CapMachine.Wpf.Services
{ {
@@ -51,6 +52,7 @@ namespace CapMachine.Wpf.Services
LinDriveService = linDriveService; LinDriveService = linDriveService;
ProRunChannel = MachineRtDataService.ProRunChannel; ProRunChannel = MachineRtDataService.ProRunChannel;
LogService = logService; LogService = logService;
CurDispatcher = Dispatcher.CurrentDispatcher;
//实例化函数 //实例化函数
ListProExModel = new List<ProExModel>(); ListProExModel = new List<ProExModel>();
@@ -116,6 +118,7 @@ namespace CapMachine.Wpf.Services
public CanDriveService CanDriveService { get; } public CanDriveService CanDriveService { get; }
public LinDriveService LinDriveService { get; } public LinDriveService LinDriveService { get; }
public ILogService LogService { get; } public ILogService LogService { get; }
public Dispatcher CurDispatcher { get; set; }
/// <summary> /// <summary>
/// 西门子连接驱动程序 /// 西门子连接驱动程序
@@ -163,17 +166,30 @@ namespace CapMachine.Wpf.Services
return $"{hours}:{minutes:D2}:{seconds:D2}"; return $"{hours}:{minutes:D2}:{seconds:D2}";
} }
/// <summary>
/// 是否在下载中
/// </summary>
public bool IsLoadProSeging { get; set; } = false; //是否加载了程序运行集合
/// <summary> /// <summary>
/// 加载选中的程序运行集合 /// 加载选中的程序运行集合
/// 目前步骤设置常值是OK的但是在斜坡多步骤里面也可以设置 50-50 10秒的常值设置那么在打点时上面的两个常值都能识别 /// 目前步骤设置常值是OK的但是在斜坡多步骤里面也可以设置 50-50 10秒的常值设置那么在打点时上面的两个常值都能识别
/// </summary> /// </summary>
public void LoadProSegRun(List<ProSegRun> SelectedListProSegRun) public async Task LoadProSegRun(List<ProSegRun> SelectedListProSegRun, CancellationToken cancellationToken = default)
{ {
if (SelectedListProSegRun == null || SelectedListProSegRun.Count() == 0) if (SelectedListProSegRun == null || SelectedListProSegRun.Count() == 0)
{ {
return; return;
} }
//标记下载过程的状态
IsLoadProSeging = true;
try
{
// 在UI线程上执行必要的UI操作
await CurDispatcher.InvokeAsync(() =>
{
//取消之前的程序执行 //取消之前的程序执行
EndProRun(); EndProRun();
//先清空之前的步骤数据 //先清空之前的步骤数据
@@ -181,12 +197,17 @@ namespace CapMachine.Wpf.Services
{ {
itemProExModel.ListProStepExe.Clear(); itemProExModel.ListProStepExe.Clear();
itemProExModel.ListSlopExStep.Clear(); itemProExModel.ListSlopExStep.Clear();
} }
});
await Task.Run(() =>
{
//多个选中的程序块循环 //多个选中的程序块循环
foreach (var itemProSegRun in SelectedListProSegRun) foreach (var itemProSegRun in SelectedListProSegRun)
{ {
cancellationToken.ThrowIfCancellationRequested();
//获取当前程序块 //获取当前程序块
//逐个对应的程序 //逐个对应的程序
var CurProgramSeg = FreeSql.Select<ProgramSeg>(itemProSegRun.ProgramSegId) var CurProgramSeg = FreeSql.Select<ProgramSeg>(itemProSegRun.ProgramSegId)
@@ -3143,6 +3164,18 @@ namespace CapMachine.Wpf.Services
//通过速度的步骤信息获取总时间 //通过速度的步骤信息获取总时间
ProRunTimeCalcModel.TotalProSec = ListProExModel.FindFirst(a => a.MeterName == "转速").ListProStepExe.Sum(a => a.KeepTime); ProRunTimeCalcModel.TotalProSec = ListProExModel.FindFirst(a => a.MeterName == "转速").ListProStepExe.Sum(a => a.KeepTime);
}, cancellationToken);
}
catch (Exception ex)
{
IsLoadProSeging = false;
}
finally
{
IsLoadProSeging = false;
}
} }

View File

@@ -16,6 +16,7 @@ using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Data; using System.Data;
using System.Text; using System.Text;
using System.Threading.Tasks;
using System.Windows; using System.Windows;
namespace CapMachine.Wpf.ViewModels namespace CapMachine.Wpf.ViewModels
@@ -2324,7 +2325,7 @@ namespace CapMachine.Wpf.ViewModels
{ {
if (_GenProPlcCmd == null) if (_GenProPlcCmd == null)
{ {
_GenProPlcCmd = new DelegateCommand(() => GenProPlcCmdMethod()); _GenProPlcCmd = new DelegateCommand(async () => await GenProPlcCmdMethod());
} }
return _GenProPlcCmd; return _GenProPlcCmd;
} }
@@ -2332,17 +2333,23 @@ namespace CapMachine.Wpf.ViewModels
/// <summary> /// <summary>
/// 生产下载执行方法 /// 生产下载执行方法
/// </summary> /// </summary>
private void GenProPlcCmdMethod() private async Task GenProPlcCmdMethod()
{ {
if (ProSegRunListViewItems != null && ProSegRunListViewItems.Count() > 0) if (ProSegRunListViewItems != null && ProSegRunListViewItems.Count() > 0)
{ {
//当前的程序开始标记 //当前的程序开始标记
//ProParsSongZhiHelper.Start(); //ProParsSongZhiHelper.Start();
if (ProRuntimeService.IsLoadProSeging)
{
MessageBox.Show("下载过程中无法操作,请下载完毕后再操作!", "提示", MessageBoxButton.OK, MessageBoxImage.Hand);
return;
}
//返回的数据 //返回的数据
List<PlcParsData> ReturnPlcParsData = new List<PlcParsData>(); List<PlcParsData> ReturnPlcParsData = new List<PlcParsData>();
ProRuntimeService.LoadProSegRun(ProSegRunListViewItems.ToList()); await ProRuntimeService.LoadProSegRun(ProSegRunListViewItems.ToList(), new CancellationToken());
////防止上一次下载的程序多余当前的步骤,为了清空多余的步骤数据,增加一行的数据 ////防止上一次下载的程序多余当前的步骤,为了清空多余的步骤数据,增加一行的数据
//ReturnPlcParsData = ProParsSongZhiHelper.AddNullData(ReturnPlcParsData); //ReturnPlcParsData = ProParsSongZhiHelper.AddNullData(ReturnPlcParsData);
@@ -3198,6 +3205,7 @@ namespace CapMachine.Wpf.ViewModels
SelectedProStepDto.SpeedCycle!.IsSlop = true; SelectedProStepDto.SpeedCycle!.IsSlop = true;
SelectedProStepDto.SpeedCycle!.Cycle = SelectedProStepDto.SpeedCycle.Cycle; SelectedProStepDto.SpeedCycle!.Cycle = SelectedProStepDto.SpeedCycle.Cycle;
//计算程序段的总时间
SumProSegTime(); SumProSegTime();
//if (MeterSpeedExDto.TotalSlopTime != GetKeepTimeBySpeed()) //if (MeterSpeedExDto.TotalSlopTime != GetKeepTimeBySpeed())
//{ //{
@@ -3259,6 +3267,7 @@ namespace CapMachine.Wpf.ViewModels
if (time.Hours > 0) if (time.Hours > 0)
{ {
parts.Add($"{time.Days}天");
parts.Add($"{time.Hours}小时"); parts.Add($"{time.Hours}小时");
parts.Add($"{time.Minutes}分"); parts.Add($"{time.Minutes}分");
parts.Add($"{time.Seconds}秒"); parts.Add($"{time.Seconds}秒");