Tôi có một hình thức cửa sổ cho phép tạo nhiều giao diện điều khiển các ứng dụng của chương trình tương tự (nó gọi program.exe bất kỳ số lần) sử dụngthật sạch giết chết một ứng dụng giao diện điều khiển từ bên trong một nhóm các giao diện điều khiển ứng dụng
process.start().
Tôi tìm kiếm một cách để xác định một hoạt động cụ thể của ứng dụng và tiêu diệt nó một cách rõ ràng (tức là đóng sạch quá trình thứ 5 của program.exe nhưng để lại tất cả các tiến trình khác đang chạy). Tôi có thể xác định mỗi quá trình khác nhau của program.exe qua id đã được đưa ra khi các quy trình đã được bắt đầu, nhưng tôi không thể để đóng ứng dụng bất kỳ cách nào khác ngoài gọi
process.kill()
mà không thực hiện một gần sạch của ứng dụng.
Tôi tin rằng tôi không thể sử dụng
kể từ khi ứng dụng không có một cửa sổ (nó được điều hành thông qua một giao diện điều khiển chạy ở chế độ nền). Tôi đang tìm cách để giết các quá trình bằng cách nhấn vào một nút trong GUI của tôi sau khi tôi chọn quá trình được giết từ một danh sách các quá trình đang chạy.
Lý do tôi cần điều này là vì tôi cần đóng tất cả các chủ đề và các khía cạnh nổi bật của từng quy trình trước khi đóng.
tôi xác định mỗi quy trình mới như sau,
Process process = new Process();
process.StartInfo = info;
ExecutionDetails details = new ExecutionDetails(run_id, process, info, session_type, strategy_type, name, ExecutionViewModel);
lock (_runs)
_runs.Add(run_id, details); // will throw on Add if duplicate id, prevent duplicate
ExecutionViewModel.NewRun(details); // add to the view model
process.Start();
đâu run_id là một GUID xác định mỗi quá trình.
Trong một lớp riêng biệt, tôi có mã được thực hiện thông qua quá trình chỉ được tham chiếu thông qua dấu nhắc lệnh khởi động chương trình (ví dụ: chương trình cuộc gọi, cung cấp biến cấu hình, v.v.).
Có cách nào để tôi có thể đóng các quy trình một cách rõ ràng không? Tôi đã nghĩ rằng có một sự kiện được gọi khi tôi muốn giết quá trình này có thể hiệu quả nhưng cho đến nay tôi đã không thể có được ý tưởng đó để làm việc vì tôi không thể chỉ định quy trình nào tôi muốn đóng.
** CHỈNH SỬA - Mã của tôi để xử lý sự kiện mà tôi đã cố gắng thực hiện nhưng nó không hoạt động.
Mã Trong Main Window
public void KillOne() {
foreach (var details in _runs.Values) {
if(details.IsSelected) {
StrategyStateManager.SessionClosed(this, details.RunId);
} } }
Mã trong StrategyStateManager (Trung lớp sử dụng để giữ các biến và các sự kiện để sử dụng trong chương trình)
public delegate void StrategyCloseEventHandler(object sender, StrategyCloseEventArgs e);
public static void SessionClosed(object sender, Guid id)
{
if(CloseSession != null)
CloseSession(sender, new StrategyCloseEventArgs(id));
}
public class StrategyCloseEventArgs : EventArgs
{
private readonly Guid id;
public StrategyCloseEventArgs(Guid run_id)
{
id = run_id;
}
public Guid GetRunID()
{
return id;
}
}
Mã trong quá trình đó đã được bắt đầu bởi cửa sổ chính
StrategyStateManager.CloseSession += (closeStrategy);
void closeStrategy(object sender, StrategyCloseEventArgs e)
{
if (e.GetRunID() == run_id)
{
strategy.cleanupForShutdown();
DBSaverSimple.shutdownAll();
logger.Warn("Simulation run stopped by user");
}
}
Tôi đã mô tả ý tưởng EventWaitHandle mà bạn đã đề xuất và nó hoạt động rất tốt. Cảm ơn – jwb555
Downvoter? Đó là phong tục để cung cấp một bình luận cho một lý do cho downvote. –