আমার প্রক্রিয়াটির প্রস্থান পদ্ধতি কেন বলা হচ্ছে না?


96

আমার কাছে নিম্নলিখিত কোড রয়েছে, তবে কেন ProcessExitedপদ্ধতিটি কখনও বলা হয় না? এটি একই রকম যদি আমি উইন্ডোজ শেল ( startInfo.UseShellExecute = false) ব্যবহার না করি ।

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = true;
startInfo.UseShellExecute = true;
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.FileName = path;
startInfo.Arguments = rawDataFileName;
startInfo.WorkingDirectory = Util.GetParentDirectory(path, 1);

try
{
     Process correctionProcess = Process.Start(startInfo);
     correctionProcess.Exited += new EventHandler(ProcessExited);                   

     correctionProcess.WaitForExit();

     status = true;
}

.....

internal void ProcessExited(object sender, System.EventArgs e)
{
      //print out here
}

উত্তর:


242

Exitedইভেন্টে কলব্যাক পাওয়ার জন্য EnableRaisingEventsঅবশ্যই সত্যে সেট করতে হবে।

Process correctionProcess = Process.Start(startInfo);
correctionProcess.EnableRaisingEvents = true;
correctionProcess.Exited += new EventHandler(ProcessExited); 

4
সংশোধনপ্রসেস.ওয়েটফরেক্সট (), এই ফাংশন ছাড়া এই কোডটি আমার পক্ষে কাজ করছে না
— কিরা

7
একটি ছোট টিপ (নন সি # বিশেষজ্ঞের জন্য পরামর্শ): Close()প্রক্রিয়া করবেন না ! রিসোর্স ম্যানেজমেন্টে বিপথগামী প্রচেষ্টার কারণে আমি প্রস্থান হ্যান্ডলারের সাথে মাঝে মাঝে সমস্যার মুখোমুখি হয়েছি। জিসিকে যথাযথভাবে এটি সংগ্রহের পরিবর্তে প্রশ্নযুক্ত কোডটি Process.Close()পরে কল Process.Start(startInfo)করা হয়েছিল। আপনার পটভূমি যদি নন-জিসি ভাষা হয় তবে সহজে ভুল (যেমন সি / সি ++)।
— জেরি

4
দুর্দান্ত ধন্যবাদ আমি এই নিয়োগটি মন্তব্য করতে চাই EnableRaisingEventsএবং EventHandlersঅবশ্যই ঠিক পরে করা উচিত Process.Start()। এটি অন্যথায় কাজ করবে না।
— ডোরুক

4
@ ডরুক আমি EnableRaisingEvents=trueকল করার আগে সেট করতে পারি Process.Start()এবং এটি দুর্দান্ত কাজ করে।
— অ্যাকশন ড্যান

29

এমএসডিএন থেকে :

প্রস্থানিত ইভেন্টটি নির্দেশ করে যে সম্পর্কিত প্রক্রিয়াটি প্রস্থান করেছে। এই ঘটনার অর্থ প্রক্রিয়াটি সমাপ্ত (বাতিল হওয়া) বা সফলভাবে বন্ধ হয়ে গেছে that এই ইভেন্টটি কেবল তখনই ঘটতে পারে যদি সক্ষম্য রাইজিংএভেণ্টস সম্পত্তিটির মান সত্য হয়।

আপনি কি এই সম্পত্তি সত্য হিসাবে সেট করেছেন?


19
এটি খুব অ-মূর্তিযুক্ত পতাকা, (যাই হোক না কেন এর ব্যবহার কী, যদি আমি ইভেন্টটি না চাই, তবে আমি এটিতে সাবস্ক্রাইব করব না!)
— টামস সেজেলি

4
খুব স্বজ্ঞাত নয়। প্রতিটি ইভেন্টের বর্ণনায় পরিষ্কারভাবে বলা উচিত যে এর জন্য এই পতাকাটি সেট করা দরকার be
— দ্য লিজেন্ডারিকপি কোডার



13

আমি উদাহরণে এসেছি new Process()একটি usingধারাটিতে in জায়গাটি । আপনি যদি Exitedবৈশিষ্ট্যটি ব্যবহার করতে চান তবে তা করবেন না । usingদফা কোন ঘটনা হ্যান্ডলগুলি সঙ্গে বরাবর উদাহরণস্বরূপ ধ্বংস Exited।

এই...

using(var process = new Process())
{
   // your logic here
}

এটি হওয়া উচিত ...

var process = new Process();

আমি এটাও লক্ষ্য করেছি। আশ্চর্যজনকভাবে যথেষ্ট, আউটপুট ডেটা প্রাপ্ত ইভেন্টগুলি দুর্দান্ত কাজ করে। বা এগুলি এত তাড়াতাড়ি ঘটতে পারে যা মূল থ্রেডে মৃত্যুদন্ড কার্যকর হওয়ার আগে ব্যবহার শেষ হয়।
— অ্যালেক্সভিবি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.