উত্তর:
নাম সহ এটি করার একটি উপায়:
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);
}
if/else@ ম্যাথেজডি: সি # স্টেটমেন্টগুলির দৈর্ঘ্য কেবল একটি লাইন যা ব্লক স্টেটমেন্টটি নির্দেশ করতে কোঁকড়া ধনুর্বন্ধনী প্রয়োজন নেই। এটি foreachএবং forবিবৃতিও যায় । এটি কোডিং শৈলীতে ফোটে।
for। C #। নেট দেব এবং আমি এই স্টাইলটি কখনও দেখিনি। যেমন তারা বলে, "আপনি প্রতিদিন নতুন কিছু শিখেন"। পোস্ট এবং উত্তরের জন্য আপনাকে ধন্যবাদ ..
প্রতিফলক ব্যবহারের পরে এটি পাওয়া সবচেয়ে সহজ উপায়। আমি এটির জন্য একটি এক্সটেনশন পদ্ধতি তৈরি করেছি:
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ক্লাসটি অভ্যন্তরীণ ...
সিঙ্ক্রোনাস সমাধান:
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.");
}
পুনঃভাগের একটি দুর্দান্ত উত্তর ছিল; তবে, প্রক্রিয়াটি শুরু করার আগে কখনও শুরু করা হয়নি এমন পরিস্থিতির জন্য এটি অ্যাকাউন্টে আসে না।
এখানে তিনি কী পোস্ট করেছেন তার একটি সংশোধিত সংস্করণ।
public static bool IsRunning(this Process process)
{
try {Process.GetProcessById(process.Id);}
catch (InvalidOperationException) { return false; }
catch (ArgumentException){return false;}
return true;
}
আমি তার আর্গুমেন্টনাল এক্সসেপশনটি সরিয়েছি কারণ এটি প্রকৃতপক্ষে একটি নাল রেফারেন্স ব্যতিক্রম বলে মনে হয় এবং এটি যেভাবেই সিস্টেম দ্বারা ছুঁড়ে ফেলা হয় এবং আমি সেই পরিস্থিতিটির জন্যও দায়বদ্ধ হয়েছি যেখানে প্রক্রিয়াটি কখনই শুরু হয় নি বা বন্ধ () পদ্ধতিটি বন্ধ করার জন্য ব্যবহৃত হয়েছিল প্রক্রিয়া।
এটি নির্ভর করে আপনি এই কার্যকারিতাটি কতটা নির্ভরযোগ্য হতে চান। আপনি যদি জানতে চান যে আপনার কাছে থাকা নির্দিষ্ট প্রক্রিয়া উদাহরণটি এখনও চলছে এবং এটি 100% নির্ভুলতার সাথে উপলব্ধ তবে আপনি ভাগ্য থেকে দূরে রয়েছেন। পরিচালিত প্রক্রিয়া অবজেক্ট থেকে প্রক্রিয়া শনাক্ত করার জন্য কেবল দুটি উপায় রয়েছে তার কারণ।
প্রথমটি হ'ল প্রক্রিয়া আইডি। দুর্ভাগ্যক্রমে, প্রক্রিয়া আইডিগুলি অনন্য নয় এবং পুনর্ব্যবহারযোগ্য হতে পারে। মিলে যাওয়া আইডির জন্য প্রক্রিয়া তালিকাগুলি অনুসন্ধান করা কেবল আপনাকে বলবে যে একই আইডি সহ একটি প্রক্রিয়া চলছে, তবে এটি আপনার প্রক্রিয়াটি অগত্যা নয়।
দ্বিতীয় আইটেমটি হ'ল প্রক্রিয়া হ্যান্ডেল। আইডির মতো হলেও এটি একই সমস্যা এবং এটির সাথে কাজ করা আরও বিশ্রী।
আপনি যদি মাঝারি স্তরের নির্ভরযোগ্যতার সন্ধান করছেন তবে একই আইডি প্রক্রিয়াটির জন্য বর্তমান প্রক্রিয়া তালিকা পরীক্ষা করা যথেষ্ট।
Process.GetProcesses()যাবার উপায় তবে আপনার প্রক্রিয়াটি কীভাবে চলছে তা নির্ভর করে (যেমন কোনও পরিষেবা বা একটি সাধারণ অ্যাপ্লিকেশন হিসাবে এটির শিরোনামবার রয়েছে কি না) তার উপর নির্ভর করে আপনার এক বা একাধিক আলাদা মানদণ্ড ব্যবহার করতে হতে পারে।
হতে পারে (সম্ভবত) আমি প্রশ্নটি ভুলভাবে পড়ছি, তবে আপনি কি HasExited সম্পত্তির সন্ধান করছেন যা আপনাকে বলবে যে আপনার প্রসেস অবজেক্ট দ্বারা প্রতিনিধিত্ব করা প্রক্রিয়াটি (সাধারণত স্বাভাবিকভাবেই বা না) প্রস্থান হয়ে গেছে।
আপনি যে প্রক্রিয়াটির একটি রেফারেন্স পেয়েছেন তার যদি একটি ইউআই থাকে তবে আপনি ইউআই বর্তমানে ব্যবহারকারী ইনপুটটিতে সাড়া দিচ্ছেন কি না তা নির্ধারণ করতে আপনি প্রতিক্রিয়াশীল সম্পত্তিটি ব্যবহার করতে পারেন।
আপনি সক্ষম-রাইজিংএভেণ্টস সেট করতে পারেন এবং প্রস্থানিত ইভেন্টটি হ্যান্ডেল করতে পারেন (যা আশ্রয়যুক্তভাবে প্রেরিত হয়) বা যদি আপনি অবরুদ্ধ করতে চান তবে ওয়েটফরএক্সিট () কল করতে পারেন।
আপনি যে প্রক্রিয়াটি চান তার জন্য আপনি একবার প্রক্রিয়া উদাহরণ ইনস্ট্যান্ট করতে পারেন এবং। নেট প্রসেস অবজেক্টটি ব্যবহার করে প্রক্রিয়াটি ট্র্যাক করে চালিয়ে যেতে পারেন (নেট ট্র্যাকিংটি যে প্রক্রিয়াটি ট্র্যাকিংয়ের প্রক্রিয়াটি মারা গিয়েছিল তা মারা গেলেও এটি স্পষ্টতই বন্ধ করে দেবে N [এটি আপনাকে প্রক্রিয়া বন্ধের সময়, ওরফে এক্সিটটাইম ইত্যাদির সময় দিতে সক্ষম হতে পারে]]
Http://msdn.microsoft.com/en-us/library/fb4aw7b8.aspx এর উদ্ধৃতি :
যখন কোনও সম্পর্কিত প্রক্রিয়াটি প্রস্থান করে (যখন এটি অপারেশন সিস্টেম দ্বারা একটি সাধারণ বা অস্বাভাবিক সমাপ্তির মাধ্যমে বন্ধ করা হয়), সিস্টেমটি প্রক্রিয়া সম্পর্কে প্রশাসনিক তথ্য সংরক্ষণ করে এবং সেই উপাদানটিতে ফিরে আসে যা ওয়েটফরএক্সিট বলে called প্রক্রিয়া উপাদানটি হ্যান্ডেলটি প্রস্থান করা প্রক্রিয়াটিতে ব্যবহার করে তথ্যের অ্যাক্সেস করতে পারে, যার মধ্যে এক্সিটটাইম অন্তর্ভুক্ত রয়েছে।
কারণ সম্পর্কিত প্রক্রিয়াটি প্রস্থান হয়ে গেছে, উপাদানটির হ্যান্ডেল সম্পত্তিটি আর কোনও বিদ্যমান প্রক্রিয়া সংস্থানকে নির্দেশ করে না। পরিবর্তে, হ্যান্ডেলটি কেবলমাত্র প্রক্রিয়া সংস্থান সম্পর্কে অপারেটিং সিস্টেমের তথ্য অ্যাক্সেসের জন্য ব্যবহার করা যেতে পারে। প্রক্রিয়া উপাদানগুলি দ্বারা প্রকাশিত হয়নি এমন প্রস্থানিত প্রক্রিয়াগুলির হ্যান্ডলগুলি সম্পর্কে সিস্টেম সচেতন, সুতরাং প্রসেস উপাদানটি নির্দিষ্ট করে সংস্থানগুলি সম্পদ মুক্ত না করা পর্যন্ত এটি মেমরিতে এক্সিটটাইম এবং হ্যান্ডেল তথ্য রাখে। এই কারণে, যখনই আপনি কোনও প্রক্রিয়া উদাহরণের জন্য স্টার্ট কল করবেন তখন সম্পর্কিত প্রক্রিয়াটি বন্ধ হয়ে গেলে ক্লোজ করুন এবং আপনার আর এ সম্পর্কে কোনও প্রশাসনিক তথ্যের প্রয়োজন নেই। বন্ধ প্রস্থান প্রক্রিয়া বরাদ্দ মেমরি মুক্ত।
আমি কয়নকয়েনের সমাধানটি চেষ্টা করেছি:
কিছু ফাইল প্রক্রিয়াকরণের আগে, আমি এটি একটি অস্থায়ী ফাইল হিসাবে অনুলিপি করে খোলাম ।
আমার হয়ে গেলে আমি অ্যাপ্লিকেশনটি বন্ধ করে রাখি যদি এটি এখনও খোলা থাকে এবং অস্থায়ী ফাইলটি মুছে ফেলা হয়:
আমি কেবল একটি প্রক্রিয়া ভেরিয়েবল ব্যবহার করি এবং এটি পরে যাচাই করি:
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 );
এটি কাজ করে (এখনও অবধি)
openApplication.HasExited(), হাসএক্সটেড কোনও ফাংশন নয়। সঠিক উপায় হবে openApplication.HasExited।
প্রসেস আইডি দ্বারা বিদ্যমান প্রক্রিয়া পরীক্ষা করার বিষয়ে নেট ফ্রেমওয়ার্কগুলি থেকে সমর্থিত এপিআই থাকা সত্ত্বেও, এই ফাংশনগুলি খুব ধীর। প্রসেস.গেটপ্রসেসেস () বা প্রসেস.গেটপ্রসেসবাইআইডি / নাম () চালাতে এটির বিপুল পরিমাণ সিপিইউ চক্রের ব্যয় হয়।
আইডি দ্বারা একটি চলমান প্রক্রিয়া পরীক্ষা করার জন্য আরও দ্রুত পদ্ধতি হ'ল নেটিভ এপিআই ওপেনপ্রসেস () ব্যবহার করা । যদি রিটার্ন হ্যান্ডেল 0 হয় তবে প্রক্রিয়াটি বিদ্যমান নেই। যদি হ্যান্ডেল 0 টির চেয়ে আলাদা হয় তবে প্রক্রিয়াটি চলছে। অনুমতি থাকার কারণে এই পদ্ধতিটি সর্বদা 100% কাজ করবে এমন কোনও গ্যারান্টি নেই।
এর সাথে যুক্ত অনেকগুলি সমস্যা রয়েছে, যেমন অন্যরা আংশিকভাবে সমাধান করেছেন বলে মনে হয়েছে:
অন্যরা উল্লিখিত বৈশিষ্ট্যগুলি অভ্যন্তরীণ হোক বা না হোক, অনুমতি অনুমতি দিলে আপনি প্রতিবিম্বের মাধ্যমে তাদের কাছ থেকে তথ্য পেতে পারেন।
var x = obj.GetType().GetProperty("Name", BindingFlags.NonPublic | BindingFlags.Instance);
আপনার জন্য Win32 কোড pinvoke পারে স্ন্যাপশট বা আপনি ব্যবহার করতে পারেন WMI যা মন্থর।
HANDLE CreateToolhelp32Snapshot(
DWORD dwFlags,
DWORD th32ProcessID
);
অন্য বিকল্পটি ওপেনপ্রসেস / ক্লোজপ্রসেস হবে, তবে আপনি এখনও ব্যতিক্রমগুলি আগের মত ছুঁড়ে ফেলে একই বিষয়গুলিতে চলে যাবেন।
ডাব্লুএমআইয়ের জন্য - অন নিউইভেন্ট। প্রপার্টি ["?"]:
string process = "notepad";
if (Process.GetProcessesByName(process).Length == 0)
{
MessageBox.Show("Working");
}
else
{
MessageBox.Show("Not Working");
}
এছাড়াও আপনি প্রতিটি সময় প্রক্রিয়াটি পরীক্ষা করার জন্য একটি টাইমার ব্যবহার করতে পারেন
length == 0প্রদর্শন করা উচিত Not Working) তবে তবুও কাজটি সম্পন্ন হবে।