Skip to content

Commit

Permalink
feat: cancellable running process
Browse files Browse the repository at this point in the history
  • Loading branch information
AuroraZiling committed Apr 11, 2024
1 parent 47d48cc commit f3590d6
Show file tree
Hide file tree
Showing 8 changed files with 56 additions and 40 deletions.
6 changes: 3 additions & 3 deletions src/PipManager/Languages/Lang.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions src/PipManager/Languages/Lang.resx
Original file line number Diff line number Diff line change
Expand Up @@ -702,8 +702,8 @@
<data name="Action_OperationCanceled_Success" xml:space="preserve">
<value>Action Cancelled</value>
</data>
<data name="Action_OperationCanceled_AlreadyRunning" xml:space="preserve">
<value>Action Already Running</value>
<data name="Action_OperationCanceled_Failed" xml:space="preserve">
<value>Failed to cancel</value>
</data>
<data name="Action_Operation_Cancel" xml:space="preserve">
<value>Cancel</value>
Expand Down
4 changes: 2 additions & 2 deletions src/PipManager/Languages/Lang.zh-cn.resx
Original file line number Diff line number Diff line change
Expand Up @@ -702,8 +702,8 @@
<data name="Action_OperationCanceled_Success" xml:space="preserve">
<value>任务已取消</value>
</data>
<data name="Action_OperationCanceled_AlreadyRunning" xml:space="preserve">
<value>任务已运行</value>
<data name="Action_OperationCanceled_Failed" xml:space="preserve">
<value>任务终止失败</value>
</data>
<data name="Action_Operation_Cancel" xml:space="preserve">
<value>取消</value>
Expand Down
6 changes: 3 additions & 3 deletions src/PipManager/Services/Action/ActionService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,15 @@ public void AddOperation(ActionListItem actionListItem)
ActionList.Add(actionListItem);
}

public string TryCancelOperation(string operationId)
public bool TryCancelOperation(string operationId)
{
var targetAction = ActionList.ToList().FindIndex(action => action.OperationId == operationId);
if (ActionList[targetAction].OperationStatus != Lang.Action_CurrentStatus_WaitingInQueue)
{
return Lang.Action_OperationCanceled_AlreadyRunning;
return environmentService.TryKillProcess();
}
ActionList.Remove(ActionList[targetAction]);
return Lang.Action_OperationCanceled_Success;
return true;
}

private static void ConsoleOutputUpdater(ref bool currentActionRunning, ref ActionListItem currentAction, string? data)
Expand Down
2 changes: 1 addition & 1 deletion src/PipManager/Services/Action/IActionService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public interface IActionService

public void AddOperation(ActionListItem actionListItem);

public string? TryCancelOperation(string operationId);
public bool TryCancelOperation(string operationId);

public void Runner();
}
68 changes: 42 additions & 26 deletions src/PipManager/Services/Environment/EnvironmentService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,48 @@ public async Task<GetVersionsResponse> GetVersions(string packageName)
return new GetVersionsResponse { Status = 1, Versions = [] };
}
}

private Process? BasicCommandProcess { get; set; }

public bool TryKillProcess()
{
if (BasicCommandProcess is null) return false;
try
{
BasicCommandProcess.Kill();
return true;
}
catch (Exception)
{
return false;
}
}

private ActionResponse RaiseProcess(string arguments, DataReceivedEventHandler consoleOutputCallback,
string[]? extraParameters = null)
{
string? extra = extraParameters != null ? string.Join(" ", extraParameters) : null;
BasicCommandProcess = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = configurationService.AppConfig.CurrentEnvironment!.PythonPath,
Arguments = $"{arguments} {extra}",
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true
}
};
BasicCommandProcess.OutputDataReceived += consoleOutputCallback;
BasicCommandProcess.Start();
BasicCommandProcess.BeginOutputReadLine();
var error = BasicCommandProcess.StandardError.ReadToEnd();
BasicCommandProcess.WaitForExit();
BasicCommandProcess.Close();
BasicCommandProcess.Dispose();
return new ActionResponse { Success = string.IsNullOrEmpty(error), Exception = ExceptionType.Process_Error, Message = error };
}

#region Basic Command

Expand Down Expand Up @@ -283,32 +325,6 @@ public ActionResponse Uninstall(string packageName, DataReceivedEventHandler con

#endregion

private ActionResponse RaiseProcess(string arguments, DataReceivedEventHandler consoleOutputCallback,
string[]? extraParameters = null)
{
string? extra = extraParameters != null ? string.Join(" ", extraParameters) : null;
var process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = configurationService.AppConfig.CurrentEnvironment!.PythonPath,
Arguments = $"{arguments} {extra}",
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true
}
};
process.OutputDataReceived += consoleOutputCallback;
process.Start();
process.BeginOutputReadLine();
var error = process.StandardError.ReadToEnd();
process.WaitForExit();
process.Close();
process.Dispose();
return new ActionResponse { Success = string.IsNullOrEmpty(error), Exception = ExceptionType.Process_Error, Message = error };
}

#region Package Version Validation

[GeneratedRegex("[-_.]+", RegexOptions.IgnoreCase)]
Expand Down
1 change: 1 addition & 0 deletions src/PipManager/Services/Environment/IEnvironmentService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ public interface IEnvironmentService
public Task<List<PackageItem>?> GetLibraries();

public Task<GetVersionsResponse> GetVersions(string packageName);
public bool TryKillProcess();

public ActionResponse Install(string packageName, DataReceivedEventHandler consoleOutputCallback, string[]? extraParameters = null);

Expand Down
5 changes: 2 additions & 3 deletions src/PipManager/ViewModels/Pages/Action/ActionViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,9 @@ private void CancelAction(string? operationId)
return;
}

var result = _actionService.TryCancelOperation(operationId);
if(result == Lang.Action_OperationCanceled_AlreadyRunning)
if(!_actionService.TryCancelOperation(operationId))
{
_toastService.Error(Lang.Action_OperationCanceled_AlreadyRunning);
_toastService.Error(Lang.Action_OperationCanceled_Failed);
Log.Warning("[Action] Operation cancellation failed (already running): {OperationId}", operationId);
}
else
Expand Down

0 comments on commit f3590d6

Please sign in to comment.