private void RunModule(Device device, Module rmodule) { var Devices = new List <Device>(); var module = (Module)rmodule.Clone(); XModule xmodule = (XModule)module.XModule.Clone(); xmodule.Devices = new List <Device>(); if (Client.BatchControl) { Devices = Client.BatchControlTag.Devices; } else { Devices = new List <Device>() { device }; } foreach (Device rdevice in Devices) { var runningmodule = rdevice.RunningModules.ToList().Find(p => p.Md5 == module.Md5); if (runningmodule != null) { Common.ShowToast("设备[" + rdevice.Name + "]正在执行模块[" + runningmodule.Name + "]中,无法重复运行!", Color.FromRgb(239, 34, 7)); continue; } if (!xmodule.IsBackground()) { //如果是前台模块,同一时间只允许运行一个 runningmodule = rdevice.RunningModules.ToList().Find(p => p.XModule.IsBackground() == false); if (runningmodule != null) { Common.ShowToast("设备[" + rdevice.Name + "]前台模块[" + runningmodule.Name + "]正在运行中,无法同时执行两个前台模块!", Color.FromRgb(239, 34, 7)); continue; } } xmodule.Devices.Add(rdevice); } xmodule.Init(); var thread = Client.StartAction(() => { //xmodule.Device = device; //显示自定义控件 var isContinue = false; Common.UiAction(() => { isContinue = xmodule.ShowUserControl(); }, false); //是否继续 if (isContinue) { var xmodules = xmodule.GetXModules(); foreach (var runmodule in xmodules) { var thread_module = Client.StartAction(() => { Dispatcher.Invoke(() => { runmodule.Device.RunningModules.Add(module); }); Client.Log("开始执行模块[" + module.Name + "]", "设备[" + runmodule.Device.Name + "]", 0); runmodule.Start(); Client.Log("成功执行模块[" + module.Name + "]", "设备[" + runmodule.Device.Name + "]", 1); Dispatcher.Invoke(() => { if (DeviceListBox.SelectedItem is Device device_selected) { if (device_selected.Id == runmodule.Device.Id) { rmodule.State = 0; } } runmodule.Device.RunningModules.Remove(module); if (runmodule.Device.RunningThreads.ContainsKey(module.Md5)) { runmodule.Device.RunningThreads.Remove(module.Md5); } }); }); if (!runmodule.Device.RunningThreads.ContainsKey(module.Md5)) { runmodule.Device.RunningThreads.Add(module.Md5, thread_module); rmodule.State = 1; } else { Common.ShowToast("设备[" + runmodule.Device.Name + "]模块[" + module.Name + "]已经在运行中!", Color.FromRgb(239, 34, 7)); } } } }, ApartmentState.STA); }