मुझे लगता है कि एक ही कार्यक्रम के कई सांत्वना अनुप्रयोगों बनाता है एक खिड़कियों रूप है के एक समूह के भीतर से एक सांत्वना आवेदन की हत्या का उपयोग करसफाई सांत्वना अनुप्रयोगों
process.start().
मैं कर रहा हूँ (यह कितनी भी बार program.exe कॉल) एप्लिकेशन के विशिष्ट चलने की पहचान करने और इसे साफ तरीके से मारने का एक तरीका ढूंढना (यानी प्रोग्राम.एक्सई की 5 वीं प्रक्रिया को साफ़ रूप से बंद करें लेकिन अन्य सभी प्रक्रियाओं को चलाना छोड़ दें)। मैं आईडी है कि जब प्रक्रियाओं शुरू किए गए दिए गए थे के माध्यम से program.exe से प्रत्येक अलग प्रक्रिया की पहचान करने में सक्षम हूँ, लेकिन मैं किसी भी तरह से आवेदन
process.kill()
बुला के अलावा अन्य बंद करने के लिए जो एक साफ पास प्रदर्शन नहीं करता असमर्थ हूँ आवेदन के
मुझे विश्वास है कि मैं
उपयोग नहीं कर सकते, क्योंकि आवेदन (यह एक सांत्वना है कि पृष्ठभूमि में चलता है के माध्यम से चलाया जाता है) का उपयोग नहीं है। मैं चल रहा प्रक्रियाओं की सूची से मारने की प्रक्रिया का चयन करने के बाद अपने जीयूआई में एक बटन पर क्लिक करके प्रक्रियाओं को मारने के लिए देख रहा हूं।
मुझे इसकी आवश्यकता क्यों है क्योंकि मुझे बंद होने से पहले प्रत्येक प्रक्रिया के सभी धागे और उत्कृष्ट पहलुओं को बंद करने की आवश्यकता है।
मैं हर नए प्रक्रिया को परिभाषित इस प्रकार,
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();
कहाँ run_id एक GUID कि प्रत्येक प्रक्रिया की पहचान करता है।
एक अलग वर्ग में मेरे पास कोड है जो प्रक्रिया के माध्यम से निष्पादित किया जाता है जिसे केवल कमांड प्रॉम्प्ट के माध्यम से संदर्भित किया जाता है जो प्रोग्राम शुरू करता है (यानी कॉल प्रोग्राम, कॉन्फ़िगर चर, आदि प्रदान करता है)।
क्या कोई तरीका है कि मैं प्रक्रियाओं को साफ तरीके से बंद कर सकता हूं? मैं सोच रहा था कि एक घटना होने पर जिसे मैं प्रक्रिया को मारना चाहता हूं, काम कर सकता है लेकिन अब तक मैं उस विचार को काम करने में सक्षम नहीं हूं क्योंकि मैं यह निर्दिष्ट करने में असमर्थ हूं कि मैं कौन सी प्रक्रिया बंद करना चाहता हूं।
** संपादित करें - इवेंट हैंडलिंग के लिए मेरा कोड जिसे मैंने प्रत्यारोपण करने का प्रयास किया है लेकिन यह काम नहीं कर रहा है।
कोड मुख्य रूप से खिड़की
public void KillOne() {
foreach (var details in _runs.Values) {
if(details.IsSelected) {
StrategyStateManager.SessionClosed(this, details.RunId);
} } }
StrategyStateManager में कोड (मध्य कार्यक्रम में उपयोग करने के लिए चर और घटनाओं पकड़ इस्तेमाल वर्ग)
प्रक्रिया में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;
}
}
कोड है कि मुख्य विंडो
द्वारा शुरू किया जा रहा है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");
}
}
दिखाने के लिए मूल प्रश्न संपादित किया है, मैंने आपके द्वारा सुझाए गए EventWaitHandle Idea को लागू किया है और यह बहुत अच्छा काम करता है। धन्यवाद – jwb555
डाउनवॉटर? डाउनवोट के लिए एक कारण देने के लिए एक टिप्पणी प्रदान करना प्रथागत है। –