কোনও প্রক্রিয়া শেষ না হওয়া পর্যন্ত অপেক্ষা করুন


206

আমি একটি আবেদন যা আছে

Process.Start()

আরেকটি অ্যাপ্লিকেশন 'এবিসি' শুরু করতে। আমি আবেদনটি শেষ না হওয়া অবধি অপেক্ষা করতে চাই (প্রক্রিয়াটি মারা যায়) এবং আমার সম্পাদন চালিয়ে যেতে হবে। আমি এটা কিভাবে করবো?

একই সাথে অ্যাপ্লিকেশন 'এবিসি' চলার একাধিক উদাহরণ থাকতে পারে।


এবং যদি আপনি এটি অবিচ্ছিন্নভাবে করতে চান (অর্থাত্ সমাপ্তির পরে একটি ইভেন্ট উত্থাপন), আপনি এসও এখানে দেখতে পারেন ।
ম্যাট

উত্তর:


401

আমি মনে করি আপনি কেবল এটি চান:

var process = Process.Start(...);
process.WaitForExit();

পদ্ধতির জন্য এমএসডিএন পৃষ্ঠাটি দেখুন । এটিতে একটি ওভারলোডও রয়েছে যেখানে আপনি সময়সীমা নির্দিষ্ট করতে পারেন, তাই আপনি সম্ভাব্যভাবে চিরকাল অপেক্ষা করছেন না।


137

ব্যবহার করবেন Process.WaitForExit? বা Process.Exitedইভেন্টটি ব্লক করতে না চাইলে সাবস্ক্রাইব করুন ? যদি এটি আপনি যা করতে চান তা না করে তবে আপনার প্রয়োজনীয়তা সম্পর্কে আমাদের আরও তথ্য দিন।


প্রসেসের সাথে অবশ্যই ভাল তথ্য রয়েছে x পরীক্ষিত, তবে ওপি "অপেক্ষা" করেছে
মাইক এম

8
@ মাইকএম: এজন্য আমি WaitForExitপ্রথমে উল্লেখ করেছি ... কিছু কিছু শেষ হয়ে গেলে আপনি আরও কোড প্রয়োগ করতে চাইতে পারেন, তবে এর অর্থ এই নয় যে আপনার বর্তমান থ্রেডটি ব্লক করতে হবে।
জন স্কিটি

7
আপনি যদি Process.Exitedইভেন্টটি ব্যবহার করতে যাচ্ছেন তবে আমি বিশ্বাস করি যে আপনাকে Process.EnableRaisingEventsসত্যে সেট করে আগেই প্রক্রিয়াটি কনফিগার করতে হবে। যদিও, এই প্রশ্নটি তিন বছরেরও বেশি পুরানো বিবেচনা করে, এটি Process.EnableRaisingEventsজিজ্ঞাসা করার সময় এটি কোনও জিনিস ছিল না।
উইল

আমি এই পৃষ্ঠায় Process.Exitedঘটনাস্থলের নামটি সন্ধান করছি । ধন্যবাদ! সম্পূর্ণতার জন্য +1
চাদ

36

আমি আমার আবেদনে নিম্নলিখিতটি করি:

Process process = new Process();
process.StartInfo.FileName = executable;
process.StartInfo.Arguments = arguments;
process.StartInfo.ErrorDialog = true;
process.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
process.Start();
process.WaitForExit(1000 * 60 * 5);    // Wait up to five minutes.

সেখানে কয়েকটি অতিরিক্ত বৈশিষ্ট্য রয়েছে যা আপনাকে দরকারী মনে হতে পারে ...


17

আপনি প্রস্থানের জন্য অপেক্ষা করতে পারেন বা আপনি ব্যবহারকারীকে "অবহিত" রাখতে (প্রত্যাশা পরিচালন) রাখার জন্য HasExited সম্পত্তিটি পেতে এবং আপনার UI আপডেট করতে পারেন:

System.Diagnostics.Process process = System.Diagnostics.Process.Start("cmd.exe");
while (!process.HasExited)
{
    //update UI
}
//done

9

Process.HasExitedপ্রক্রিয়াভুক্ত উইন্ডোটি বন্ধ করার পরে আমার একটি কেস পরিবর্তিত হয়নি। সুতরাং Process.WaitForExit()এছাড়াও কাজ করে নি। Process.Respondingউইন্ডোটি বন্ধ করার পরে এটি আমাকে মিথ্যাতে গিয়ে পর্যবেক্ষণ করতে হয়েছিল:

while (!_process.HasExited && _process.Responding) {
  Thread.Sleep(100);
}
...

সম্ভবত এটি কাউকে সাহায্য করে।



1

মাইক্রোসফ্ট উদাহরণ উল্লেখ করে: [ https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.process.enableraisingevents?view=netframework-4.8]

সেরা সেট করা হবে:

myProcess.EnableRaisingEvents = true;

অন্যটি কোড ব্লক করা হবে। এছাড়াও কোন অতিরিক্ত সম্পত্তি প্রয়োজন।

// Start a process and raise an event when done.
myProcess.StartInfo.FileName = fileName;
// Allows to raise event when the process is finished
myProcess.EnableRaisingEvents = true;
// Eventhandler wich fires when exited
myProcess.Exited += new EventHandler(myProcess_Exited);
// Starts the process
myProcess.Start();

// Handle Exited event and display process information.
private void myProcess_Exited(object sender, System.EventArgs e)
{
Console.WriteLine(
                  $"Exit time    : {myProcess.ExitTime}\n" +
                  $"Exit code    : {myProcess.ExitCode}\n" +
                  $"Elapsed time : {elapsedTime}");
}

0

জন স্কিটি যেমন বলেছে তেমনটি ব্যবহার করুন Process.Exited:

proc.StartInfo.FileName = exportPath + @"\" + fileExe;
proc.Exited += new EventHandler(myProcess_Exited);
proc.Start();
inProcess = true;

while (inProcess)
{
    proc.Refresh();
    System.Threading.Thread.Sleep(10);
    if (proc.HasExited)
    {
        inProcess = false;
    }
}

private void myProcess_Exited(object sender, System.EventArgs e)
{
    inProcess = false;
    Console.WriteLine("Exit time:    {0}\r\n" +
      "Exit code:    {1}\r\n", proc.ExitTime, proc.ExitCode);
}

সত্যই প্রশ্নের উত্তর দেয় না। প্রশ্নটি সমাধান করতে দয়া করে আপনার উত্তরটি পরিমার্জন করুন
গ্র্যান্টলি

এবং এখন? সম্ভবত ভিবি খুলুন এবং সমাধানটি করুন;)
ডেভিড লোপস

-5

এটা চেষ্টা কর:

string command = "...";
var process = Process.Start(command);
process.WaitForExit();

5
ইতিমধ্যে উত্তর দেওয়া প্রশ্নের সম্পর্কে ইতিমধ্যে জবাব দেওয়া প্রশ্নের উত্তরে মন্তব্য করার মূল বিষয়টি কী? আপনি কেবল নিজের চক্র নষ্ট করেননি, আপনি আমাকে আমার অপচয় করতে বাধ্য করেছেন।
জেমি ইভানভ

@ অ্যাডামবিলিনস্কি প্রশ্ন এবং উত্তরগুলি অন্য লোকেরা দেখতে চান যাঁদের কাছে প্রশ্ন রয়েছে কেবল এটিই নয়
L3n

4
@ L3n আমি সম্মত, তবে এই উত্তরটি গৃহীত উত্তরের মতো ঠিক তাই এটি অর্থহীন!
অ্যাডাম বিলিনস্কি

@ অ্যাডামবিলিনস্কি ওহ হ্যাঁ আপনার মন্তব্যটি সঠিকভাবে
পড়েননি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.