কোনও প্রক্রিয়া চলছে কিনা আমি কীভাবে জানতে পারি?


155

আমি যখন কোনওটির একটি রেফারেন্স পাই System.Diagnostics.Process, আমি কীভাবে জানতে পারি যে কোনও প্রক্রিয়া বর্তমানে চলছে?

উত্তর:


252

নাম সহ এটি করার একটি উপায়:

Process[] pname = Process.GetProcessesByName("notepad");
if (pname.Length == 0)
  MessageBox.Show("nothing");
else
  MessageBox.Show("run");

পরে কারসাজির জন্য আইডি পেতে আপনি সমস্ত প্রক্রিয়াটি লুপ করতে পারেন:

Process[] processlist = Process.GetProcesses();
foreach(Process theprocess in processlist){
   Console.WriteLine("Process: {0} ID: {1}", theprocess.ProcessName, theprocess.Id);
}

এই আমি ঠিক খুঁজছিলাম ছিল। যদিও এটি খুব পুরানো পোস্ট, আপনি কী আমাকে এটি ব্যাখ্যা করবেন যে এটি কীভাবে বৈধ C #। আমি এটি নিয়ে সন্দেহ করছি না, আমি এটি কাজ করে দেখছি তবে আমি else without ছাড়া অন্য কখনও দেখিনি}
ম্যাথুডি

4
if/else@ ম্যাথেজডি: সি # স্টেটমেন্টগুলির দৈর্ঘ্য কেবল একটি লাইন যা ব্লক স্টেটমেন্টটি নির্দেশ করতে কোঁকড়া ধনুর্বন্ধনী প্রয়োজন নেই। এটি foreachএবং forবিবৃতিও যায় । এটি কোডিং শৈলীতে ফোটে।
হলমানাক

আমি এটি নিয়েও কিছু গবেষণা করেছি, তথ্যটি পেয়েছি, তবে তথ্যটি আমি পাইনি for। C #। নেট দেব এবং আমি এই স্টাইলটি কখনও দেখিনি। যেমন তারা বলে, "আপনি প্রতিদিন নতুন কিছু শিখেন"। পোস্ট এবং উত্তরের জন্য আপনাকে ধন্যবাদ ..
ম্যাথুডি

3
@ ম্যাথহেডি হ্যাঁ, এটি বেশিরভাগ ভাষার পক্ষে আসলে (জাভার মতো)। এ জাতীয় ও-লাইনারগুলি এড়াতে এবং সর্বদা কোঁকড়ানো ধনুর্বন্ধনীগুলি এড়াতে এটি সাধারণত ভাল অনুশীলন, যেহেতু ভবিষ্যতে আপনার আরও বক্তব্য যুক্ত করার সম্ভাবনা রয়েছে এমন কোনও সম্ভাবনা রয়েছে, যখন আপনার প্রয়োজনের সময় ধনুর্বন্ধনীগুলি ইতিমধ্যে সেখানে উপস্থিত থাকে। তবে এই জাতীয় জিনিসের জন্য, আপনি যদি 100% নিশ্চিত হন তবে আপনার কেবল একটি বিবৃতি প্রয়োজন, এটি করা ঠিক আছে এবং সিন্টেক্সিকভাবে বৈধ।
ডেভিড মর্ডিগাল

1
আপনি যদি প্রক্রিয়াটি খুঁজে না পান তবে এক্সটেনশনটি সরিয়ে চেষ্টা করুন। (প্রাক্তন: .exe)
DxTx

28

প্রতিফলক ব্যবহারের পরে এটি পাওয়া সবচেয়ে সহজ উপায়। আমি এটির জন্য একটি এক্সটেনশন পদ্ধতি তৈরি করেছি:

public static class ProcessExtensions
{
    public static bool IsRunning(this Process process)
    {
        if (process == null) 
            throw new ArgumentNullException("process");

        try
        {
            Process.GetProcessById(process.Id);
        }
        catch (ArgumentException)
        {
            return false;
        }
        return true;
    }
}

Process.GetProcessById(processId)পদ্ধতি আহ্বান ProcessManager.IsProcessRunning(processId)পদ্ধতি এবং ছোঁড়ার ArgumentExceptionক্ষেত্রে প্রক্রিয়া বিদ্যমান নয় হবে। কোনও কারণে ProcessManagerক্লাসটি অভ্যন্তরীণ ...


এটি সত্যিই একটি ভাল উত্তর ছিল; তবে আপনার যুক্তিটি নাল ব্যতিক্রম হওয়া উচিত নয় (কারণ নাল রেফারেন্স ব্যতিক্রম যাইহোক নিক্ষেপ করা হত এবং আপনি ব্যতিক্রম সহ কিছুই করেননি Also এছাড়াও, আপনি যদি স্টার্টটি না প্রার্থনা করেন তবে আপনি একটি অবৈধ অপারেশন পাবেন) পদ্ধতি অথবা আপনি প্রার্থনা ঘনিষ্ঠ () মেথড আমি এই দুই পরিস্থিতিতে জন্য অ্যাকাউন্টে অন্য উত্তর পোস্ট করা
Aelphaeis

16

সিঙ্ক্রোনাস সমাধান:

void DisplayProcessStatus(Process process)
{
    process.Refresh();  // Important


    if(process.HasExited)
    {
        Console.WriteLine("Exited.");
    }
    else
    {
        Console.WriteLine("Running.");
    } 
}

অ্যাসিনক্রোনাস সমাধান:

void RegisterProcessExit(Process process)
{
    // NOTE there will be a race condition with the caller here
    //   how to fix it is left as an exercise
    process.Exited += process_Exited;
}

static void process_Exited(object sender, EventArgs e)
{
   Console.WriteLine("Process has exited.");
}

6
প্রথম বিকল্পের জন্য: প্রক্রিয়াটি প্রথম স্থানে শুরু হয়েছিল কিনা তা আমি কীভাবে জানতে পারি?
পুনরায় আকার

8

পুনঃভাগের একটি দুর্দান্ত উত্তর ছিল; তবে, প্রক্রিয়াটি শুরু করার আগে কখনও শুরু করা হয়নি এমন পরিস্থিতির জন্য এটি অ্যাকাউন্টে আসে না।

এখানে তিনি কী পোস্ট করেছেন তার একটি সংশোধিত সংস্করণ।

    public static bool IsRunning(this Process process)
    {
        try  {Process.GetProcessById(process.Id);}
        catch (InvalidOperationException) { return false; }
        catch (ArgumentException){return false;}
        return true;
    }

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


ব্যক্তিগতভাবে, আমি একটি নালরফেরান এক্সেপশনের চেয়ে লগ হওয়া ব্যতিক্রম পর্যালোচনা করার সময় একটি আর্গুমেন্টনালএক্সেপশন দেখতে পাচ্ছি, যেহেতু আর্গুমেন্টনুল এক্সসেপশনটি কী ভুল হয়েছে সে সম্পর্কে আরও স্পষ্ট is
শান

1
@ শীন আমি সাধারণত আপনার সাথে একমত হই তবে এটি একটি এক্সটেনশন পদ্ধতি। আমি মনে করি সিনট্যাক্সের ভিত্তিতে নাল পয়েন্টার ব্যতিক্রম নিক্ষেপ করা আরও উপযুক্ত, এটি নাল বস্তুর কল করার পদ্ধতিগুলির সাথে আরও সুসংগত বোধ করে।
আলেফাইস

এটি প্রতিবার ফার্স্টহ্যান্ডলেক্সপশন ইভেন্ট হ্যান্ডলারকে ট্রিগার করবে। সেখানে আপনার লগগুলিকে স্প্যাম করার উপায়।
লেটেন্সি

6

এটি এক-লাইনার হওয়া উচিত:

public static class ProcessHelpers {
    public static bool IsRunning (string name) => Process.GetProcessesByName(name).Length > 0;
}

3

এটি নির্ভর করে আপনি এই কার্যকারিতাটি কতটা নির্ভরযোগ্য হতে চান। আপনি যদি জানতে চান যে আপনার কাছে থাকা নির্দিষ্ট প্রক্রিয়া উদাহরণটি এখনও চলছে এবং এটি 100% নির্ভুলতার সাথে উপলব্ধ তবে আপনি ভাগ্য থেকে দূরে রয়েছেন। পরিচালিত প্রক্রিয়া অবজেক্ট থেকে প্রক্রিয়া শনাক্ত করার জন্য কেবল দুটি উপায় রয়েছে তার কারণ।

প্রথমটি হ'ল প্রক্রিয়া আইডি। দুর্ভাগ্যক্রমে, প্রক্রিয়া আইডিগুলি অনন্য নয় এবং পুনর্ব্যবহারযোগ্য হতে পারে। মিলে যাওয়া আইডির জন্য প্রক্রিয়া তালিকাগুলি অনুসন্ধান করা কেবল আপনাকে বলবে যে একই আইডি সহ একটি প্রক্রিয়া চলছে, তবে এটি আপনার প্রক্রিয়াটি অগত্যা নয়।

দ্বিতীয় আইটেমটি হ'ল প্রক্রিয়া হ্যান্ডেল। আইডির মতো হলেও এটি একই সমস্যা এবং এটির সাথে কাজ করা আরও বিশ্রী।

আপনি যদি মাঝারি স্তরের নির্ভরযোগ্যতার সন্ধান করছেন তবে একই আইডি প্রক্রিয়াটির জন্য বর্তমান প্রক্রিয়া তালিকা পরীক্ষা করা যথেষ্ট।


1

Process.GetProcesses()যাবার উপায় তবে আপনার প্রক্রিয়াটি কীভাবে চলছে তা নির্ভর করে (যেমন কোনও পরিষেবা বা একটি সাধারণ অ্যাপ্লিকেশন হিসাবে এটির শিরোনামবার রয়েছে কি না) তার উপর নির্ভর করে আপনার এক বা একাধিক আলাদা মানদণ্ড ব্যবহার করতে হতে পারে।


আপনি যদি এই পদ্ধতিটি কোনও লুপে রাখেন তবে এর জন্য অনেকগুলি সিপিইউ চক্রের ব্যয় হয়। আমি getProcessByName () বা GetProcessByID () ব্যবহার করার পরামর্শ দিচ্ছি।
হাও এনগুইন

0

হতে পারে (সম্ভবত) আমি প্রশ্নটি ভুলভাবে পড়ছি, তবে আপনি কি HasExited সম্পত্তির সন্ধান করছেন যা আপনাকে বলবে যে আপনার প্রসেস অবজেক্ট দ্বারা প্রতিনিধিত্ব করা প্রক্রিয়াটি (সাধারণত স্বাভাবিকভাবেই বা না) প্রস্থান হয়ে গেছে।

আপনি যে প্রক্রিয়াটির একটি রেফারেন্স পেয়েছেন তার যদি একটি ইউআই থাকে তবে আপনি ইউআই বর্তমানে ব্যবহারকারী ইনপুটটিতে সাড়া দিচ্ছেন কি না তা নির্ধারণ করতে আপনি প্রতিক্রিয়াশীল সম্পত্তিটি ব্যবহার করতে পারেন।

আপনি সক্ষম-রাইজিংএভেণ্টস সেট করতে পারেন এবং প্রস্থানিত ইভেন্টটি হ্যান্ডেল করতে পারেন (যা আশ্রয়যুক্তভাবে প্রেরিত হয়) বা যদি আপনি অবরুদ্ধ করতে চান তবে ওয়েটফরএক্সিট () কল করতে পারেন।


0

আপনি যে প্রক্রিয়াটি চান তার জন্য আপনি একবার প্রক্রিয়া উদাহরণ ইনস্ট্যান্ট করতে পারেন এবং। নেট প্রসেস অবজেক্টটি ব্যবহার করে প্রক্রিয়াটি ট্র্যাক করে চালিয়ে যেতে পারেন (নেট ট্র্যাকিংটি যে প্রক্রিয়াটি ট্র্যাকিংয়ের প্রক্রিয়াটি মারা গিয়েছিল তা মারা গেলেও এটি স্পষ্টতই বন্ধ করে দেবে N [এটি আপনাকে প্রক্রিয়া বন্ধের সময়, ওরফে এক্সিটটাইম ইত্যাদির সময় দিতে সক্ষম হতে পারে]]

Http://msdn.microsoft.com/en-us/library/fb4aw7b8.aspx এর উদ্ধৃতি :

যখন কোনও সম্পর্কিত প্রক্রিয়াটি প্রস্থান করে (যখন এটি অপারেশন সিস্টেম দ্বারা একটি সাধারণ বা অস্বাভাবিক সমাপ্তির মাধ্যমে বন্ধ করা হয়), সিস্টেমটি প্রক্রিয়া সম্পর্কে প্রশাসনিক তথ্য সংরক্ষণ করে এবং সেই উপাদানটিতে ফিরে আসে যা ওয়েটফরএক্সিট বলে called প্রক্রিয়া উপাদানটি হ্যান্ডেলটি প্রস্থান করা প্রক্রিয়াটিতে ব্যবহার করে তথ্যের অ্যাক্সেস করতে পারে, যার মধ্যে এক্সিটটাইম অন্তর্ভুক্ত রয়েছে।

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


0

আমি কয়নকয়েনের সমাধানটি চেষ্টা করেছি:
কিছু ফাইল প্রক্রিয়াকরণের আগে, আমি এটি একটি অস্থায়ী ফাইল হিসাবে অনুলিপি করে খোলাম ।
আমার হয়ে গেলে আমি অ্যাপ্লিকেশনটি বন্ধ করে রাখি যদি এটি এখনও খোলা থাকে এবং অস্থায়ী ফাইলটি মুছে ফেলা হয়:
আমি কেবল একটি প্রক্রিয়া ভেরিয়েবল ব্যবহার করি এবং এটি পরে যাচাই করি:

private Process openApplication;  
private void btnOpenFile_Click(object sender, EventArgs e) {  
    ...
    // copy current file to fileCache  
    ...  
    // open fileCache with proper application
    openApplication = System.Diagnostics.Process.Start( fileCache );  
}

পরে আমি অ্যাপ্লিকেশনটি বন্ধ করে দিই:

 ...   
openApplication.Refresh(); 

// close application if it is still open       
if ( !openApplication.HasExited() ) {
    openApplication.Kill();  
}

// delete temporary file  
System.IO.File.Delete( fileCache );

এটি কাজ করে (এখনও অবধি)


3
openApplication.HasExited(), হাসএক্সটেড কোনও ফাংশন নয়। সঠিক উপায় হবে openApplication.HasExited
caiosm1005

0

প্রসেস আইডি দ্বারা বিদ্যমান প্রক্রিয়া পরীক্ষা করার বিষয়ে নেট ফ্রেমওয়ার্কগুলি থেকে সমর্থিত এপিআই থাকা সত্ত্বেও, এই ফাংশনগুলি খুব ধীর। প্রসেস.গেটপ্রসেসেস () বা প্রসেস.গেটপ্রসেসবাইআইডি / নাম () চালাতে এটির বিপুল পরিমাণ সিপিইউ চক্রের ব্যয় হয়।

আইডি দ্বারা একটি চলমান প্রক্রিয়া পরীক্ষা করার জন্য আরও দ্রুত পদ্ধতি হ'ল নেটিভ এপিআই ওপেনপ্রসেস () ব্যবহার করা । যদি রিটার্ন হ্যান্ডেল 0 হয় তবে প্রক্রিয়াটি বিদ্যমান নেই। যদি হ্যান্ডেল 0 টির চেয়ে আলাদা হয় তবে প্রক্রিয়াটি চলছে। অনুমতি থাকার কারণে এই পদ্ধতিটি সর্বদা 100% কাজ করবে এমন কোনও গ্যারান্টি নেই।


0

এর সাথে যুক্ত অনেকগুলি সমস্যা রয়েছে, যেমন অন্যরা আংশিকভাবে সমাধান করেছেন বলে মনে হয়েছে:

  • কোনও উদাহরণ সদস্যদের থ্রেড নিরাপদ থাকার গ্যারান্টি নেই। অর্থ রেসের শর্তগুলি রয়েছে যা স্ন্যাপশটের জীবনকালের সাথে অবজেক্টের বৈশিষ্ট্যগুলি মূল্যায়নের চেষ্টা করার সময় ঘটতে পারে।
  • প্রক্রিয়া হ্যান্ডেল Win32Exceptionটি অ্যাক্সেস ডেনিয়েডের জন্য ছুঁড়ে ফেলবে যেখানে এটি এবং এই জাতীয় অন্যান্য বৈশিষ্ট্যের মূল্যায়নের অনুমতি অনুমোদিত নয়।
  • আইএসএন রানিংয়ের স্থিতির জন্য, এর কয়েকটি বৈশিষ্ট্য মূল্যায়নের চেষ্টা করার সময় একটি যুক্তি-ধারণাও উত্থাপিত হবে।

অন্যরা উল্লিখিত বৈশিষ্ট্যগুলি অভ্যন্তরীণ হোক বা না হোক, অনুমতি অনুমতি দিলে আপনি প্রতিবিম্বের মাধ্যমে তাদের কাছ থেকে তথ্য পেতে পারেন।

var x = obj.GetType().GetProperty("Name", BindingFlags.NonPublic | BindingFlags.Instance);

আপনার জন্য Win32 কোড pinvoke পারে স্ন্যাপশট বা আপনি ব্যবহার করতে পারেন WMI যা মন্থর।

HANDLE CreateToolhelp32Snapshot(
  DWORD dwFlags,
  DWORD th32ProcessID
);

অন্য বিকল্পটি ওপেনপ্রসেস / ক্লোজপ্রসেস হবে, তবে আপনি এখনও ব্যতিক্রমগুলি আগের মত ছুঁড়ে ফেলে একই বিষয়গুলিতে চলে যাবেন।

ডাব্লুএমআইয়ের জন্য - অন নিউইভেন্ট। প্রপার্টি ["?"]:

  • "ParentProcessID"
  • "ProcessID"
  • "প্রক্রিয়ার নাম"
  • "SECURITY_DESCRIPTOR"
  • "SessionId"
  • "সিদ"
  • "TIME_CREATED"

0
string process = "notepad";
if (Process.GetProcessesByName(process).Length == 0)
{
    MessageBox.Show("Working");
}
else
{
    MessageBox.Show("Not Working");
}

এছাড়াও আপনি প্রতিটি সময় প্রক্রিয়াটি পরীক্ষা করার জন্য একটি টাইমার ব্যবহার করতে পারেন


3
চারপাশে অন্য উপায় হবে না? যদি দৈর্ঘ্য == 0 এর অর্থ কাজ হচ্ছে না?
জে জ্যাকবস

: উত্তর প্যাট্রিক Desjardins দ্বারা হিসাবে একই stackoverflow.com/a/262291/7713750
Rekshino

দৈর্ঘ্যের চারপাশে এর অন্যান্য উপায়ে> 0 মানে প্রক্রিয়াগুলি পাওয়া যায়।
HaseeB মীর

এটিতে একটি ত্রুটি থাকতে পারে, ( length == 0প্রদর্শন করা উচিত Not Working) তবে তবুও কাজটি সম্পন্ন হবে।
মোমোরো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.