亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

基于C#實現(xiàn)進程回收管理工具

 更新時間:2024年04月16日 09:00:07   作者:初九之潛龍勿用  
這篇文章主要為大家詳細介紹了入戶基于C#實現(xiàn)一個進程回收管理工具,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

設(shè)計初衷

在使用 COM 模式操作 OFFICE 組件的開發(fā)過程中,當(dāng)操作完相關(guān)文檔后,在某些情況下仍然無法釋放掉 Word 或 EXCEL 等應(yīng)用進程,因此根據(jù)進程活動情況或時間點范圍開發(fā)了一個強制殺掉指定進程名稱的 WinForm 程序,做為一種輔助工具運行在云服務(wù)器上,命名為 Craneoffice ProcessGC。

開發(fā)運行環(huán)境

操作系統(tǒng): Windows Server 2019 DataCenter

.net版本: .netFramework4.0 或以上

開發(fā)工具:VS2019  C#

Craneoffice ProcessGC

該工具軟件屬綠色版,無須安裝,直接運行 bin 目錄下的 ProcessGC.exe 即可,同目錄下的 ProcessList.txt 為配置文件,用于配置要釋放的進程,后續(xù)也可用工具程序進行操作。

運行主界面

運行后的主界面如下圖:

主界面顯示了要回收的進程列表,源引于 ProcessList.txt 文件配置,如圖示例我們可以看到欲回收的進程為EXCEL和WORD,下面則顯示已被回收的進程(如果有的話)。

下方顯示 CPU 的利用率和可用內(nèi)存情況。

系統(tǒng)會隨時監(jiān)測指定的進程名,如果有則按指定的策略進行管理。

管理任務(wù)與策略

點擊管理任務(wù)選項卡,顯示如下圖:

策略設(shè)置如下表:

序號說明
1要添加回收的進程名請正確添加,無須輸入擴展名,如果不確定名稱則可以通過任務(wù)管理器進行查看
2管理策略共分三種方式:
1、Force(默認值,表示符合條件則強制關(guān)閉)
2、CPU
3、Memory
3回收時間差(秒)以秒為單位,記錄進程停止活動的時間,超過停止活動時間的進程將被回收
4上限指標1、上限指標不能小于零。
2、當(dāng)選用的策略為CPU時,上限指標不能大于100(即最高100%占用率)
3、當(dāng)選用的策略為Memory時,指定為Mb值,表示內(nèi)存占用的最高上限
5檢測時間標準共有兩種方式:
1、ByProcess,以進程時間計算(默認)
2、ByNowTime,以啟動當(dāng)前時間計算
6回收動作共有兩種方式:
1、Kill,直接關(guān)閉釋放進程(默認)
2、Command,執(zhí)行命令行操作
7相關(guān)動作命令當(dāng)?shù)?項回收動作為Command時,此項為必輸入項,表示要執(zhí)行的 WINDOWS 命令行操作
8重新啟用命令設(shè)置此項,則當(dāng)關(guān)閉或執(zhí)行動作命令后,嘗試執(zhí)行此命令
9計劃強制關(guān)閉時間(小時)可以設(shè)定小時:分:秒(這個值前綴需要設(shè)置一個有效日期),代表每到此時此分此秒,則強制關(guān)閉進程

通過以上設(shè)置,我們可以靈活的對進程的關(guān)閉方式進行控制,以達到實際應(yīng)用的目的。

其它設(shè)置

選擇設(shè)置選項卡,如下圖:

我們可設(shè)置窗口的透明度,另外可以設(shè)置兩個選項:

1、只回收本程序啟動時間以后的進程

2、只回收非激活窗口的進程, 指非操作系統(tǒng)顯式的應(yīng)用進程。

3、管理密碼:默認值為111111,用于關(guān)閉應(yīng)用程序等操作。

移動存儲設(shè)備管理

這個選項如下圖:

這是為移動設(shè)備存儲數(shù)據(jù)庫準備的一個選項,點擊停止服務(wù)可以有效的、安全的移除存儲設(shè)備,也可以繼續(xù)啟動服務(wù)。這個選項較少使用,也需要謹慎使用(因為它會嘗試停止IIS、MS SQL SERVER 數(shù)據(jù)庫服務(wù)等)。

核心代碼-計時器監(jiān)控

		private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
		{
			DateTime cur_now=System.DateTime.Now;
			int cur_hour=cur_now.Hour;
			int cur_min=cur_now.Minute;
			int cur_sec=cur_now.Second;
		
			pc.CategoryName="Processor";
			pc.CounterName="% Processor Time";
			pc.InstanceName="_Total";
			
//			pc.MachineName="michaeljane";
			float pcv=pc.NextValue();
			label7.Text="CPU利用率:"+(pcv).ToString()+" %";
			cpubar.Value=(int)(pcv);
 
			pcmem.CategoryName="Memory";
			pcmem.CounterName="Available MBytes";
			pcmem.InstanceName=null;
 
//			richTextBox1.Text=pcpu.NextValue().ToString()+"\r\n";
			
 
			/*			System.Diagnostics.PerformanceCounter[] mypc; 
			System.Diagnostics.PerformanceCounterCategory mycat = 
				new System.Diagnostics.PerformanceCounterCategory("process");
			// Remove the current contents of the list.
			// Retrieve the counters.
			mypc = mycat.GetCounters();
			// Add the retrieved counters to the list.
			richTextBox1.Text="";
			for (int i = 0; i < mypc.Length; i++) 
			{ 
				richTextBox1.Text+=(mypc[i].CounterName)+"\r\n";
			}
*/
 
//			float cpuLoad = pc.NextValue();
            try
            {
                label7.Text += "\r\n可用內(nèi)存:" + pcmem.NextValue().ToString() + "M";
            }
            catch (Exception s)
            {
            }
			statusBar1.Text=cur_now.ToString();  //顯示當(dāng)前時間
			Process[] processes; //定義進程組
			processes = System.Diagnostics.Process.GetProcesses(); //獲得當(dāng)前進程組
			Process process;  //定義初始進程中間變量
			string _pname,_killstate="";   //定義進程名變量,及進程回收狀態(tài)字符串
			bool _kill=false;  //是否要回收標志變量
			bool _phandle=checkBox2.Checked;
			int _gcSpan;  //時間差變量
			DateTime _pdatetime,_checktime,_stdtime; //進程啟動的時間變量和檢測時間變量
			string[] _rv;    //接受檢測結(jié)果的數(shù)組
			System.TimeSpan _dd; //時間差的秒數(shù)變量
//			string[] _processid=new string[1000];
//			DateTime[] _processLastTime=new DateTime[1000];
//			int[] _processLastMem=new int[1000];
				for(int i = 0;i<processes.Length-1;i++)
				{
					process= processes[i];  //獲得當(dāng)前進程
					_pname=process.ProcessName.ToLower();  //獲得進程名并轉(zhuǎn)為小寫
                try
                {
                    _pdatetime = process.StartTime;  //獲得進程的啟動時間
                }catch(Exception e1)
                {
                    continue;
                }
					//				_rv=GetSubValueIndex(listBox1,_pname,"|");  //得到要回收的用戶指定進程
					for(int li=0;li<listBox1.Items.Count;li++)
					{
						_rv=listBox1.Items[li].ToString().Split('|');
						string ref_process=_rv[0].ToLower().Trim();
						int ref_span=int.Parse(_rv[1].ToString());
						string ref_cl=_rv[2].ToLower().Trim();
						float ref_rank=float.Parse(_rv[3].ToString());
						string ref_stdtime=_rv[4].ToLower().Trim();
						string ref_act=_rv[5].ToLower().Trim();
						string[] ref_cmd1=_rv[6].Split('↙');
						string[] ref_cmd2=_rv[7].Split('↙');
						string ref_closetime=_rv[8].Trim();
						//				richTextBox1.Text+=_rv[0]+_rv[1]+"\r\n";
					
						if(ref_process==_pname)  //如果是要回收的進程則進行處理
						{
							//如果在檢測數(shù)組沒有找到,則添加到檢測數(shù)中
							int _curpoint=System.Array.IndexOf(_processid,process.Id);
							if(_curpoint<0)
							{
								_stdtime=process.StartTime;
								if(ref_stdtime=="bynowtime")
								{
									_stdtime=System.DateTime.Now;
								}
								System.Diagnostics.PerformanceCounter pcm=new System.Diagnostics.PerformanceCounter("Process","% Processor Time",_pname);
                            try
                            {
                                AddArray(process.Id, _stdtime, process.WorkingSet, pcm);
                            }catch(Exception e3)
                            {
 
                            }
								continue;
							}
                        //						richTextBox1.Text+=((System.Diagnostics.PerformanceCounter)_processLastCPU[_curpoint]).NextValue().ToString()+"\r\n";
                        try
                        {
                            float cur_rank = ((System.Diagnostics.PerformanceCounter)_processLastCPU[_curpoint]).NextValue();
                            _checktime = System.DateTime.Now;  //檢測時間為當(dāng)前時間
                                                               //開始分析CPU策略
                            if (ref_cl == "cpu")
                            {
                                //如果當(dāng)前進程的CPU占用率沒有超過指定的上限,則重置最后的檢測時間為當(dāng)前時間,繼續(xù)監(jiān)測。
                                if (cur_rank < ref_rank)
                                {
                                    _processLastTime[_curpoint] = _checktime;
                                }
                            }
                        }catch(Exception e2)
                        {
                            continue;
                        }
							//開始分析memory策略
							if(ref_cl=="memory")
							{
								float _curmem=process.WorkingSet/(1024*1024);
								//							richTextBox1.Text+=_pname+" "+_curmem.ToString()+"\r\n";
								//如果當(dāng)前進程的內(nèi)存占用沒有超過指定的上限,則重置最后的檢測時間為當(dāng)前時間,繼續(xù)監(jiān)測。
								if(_curmem<ref_rank)
								{
									_processLastTime[_curpoint]=_checktime;
								}
							}
							_gcSpan=ref_span;  //得到用戶指定的回收時間差
							_kill=false;
							_pdatetime=_processLastTime[_curpoint]; //得到進程的數(shù)組最后指定時間
							_dd=_checktime-_pdatetime;     //時間差以檢測時間 減去 進行啟動時間
							//如果時間差大于回收指定時間則可以回收進程,KILL變量為真
							if(checkBox1.Checked)
							{
								//只回收本程序啟動以后的進程時間
								if((_dd.TotalSeconds>_gcSpan)&&(_starttime<_pdatetime))
								{
									_kill=true;
								}
							}
							else
							{
								if(_dd.TotalSeconds>_gcSpan)
								{
									_kill=true;
								}
							}
							//如果初期標識為可以關(guān)閉該進程,并且策略為強制性關(guān)閉,則進行內(nèi)存判斷
							if((_kill)&&(ref_cl=="force"))
							{
								//如果內(nèi)存有變化,則表示進程仍在活動,則不進行關(guān)閉,并更新檢測內(nèi)容
								int _curmem=process.WorkingSet;
								label6.Text=_curmem.ToString()+"  "+_processLastMem[_curpoint];
								if(_curmem!=_processLastMem[_curpoint])
								{
									_processLastTime[_curpoint]=_checktime;
									_processLastMem[_curpoint]=_curmem;
									_kill=false;
								}
							}
							//如果指定了強制關(guān)閉時間,則進行判斷
							string close_tip="";
							if(ref_closetime!="")
							{
								DateTime ref_cls=DateTime.Parse(ref_closetime);
								if((ref_cls.Hour==cur_hour)&&(ref_cls.Minute==cur_min)&&(ref_cls.Second==cur_sec))
								{
									_kill=true;
								    close_tip="強制關(guān)閉計劃啟動,計劃時間為:"+ref_closetime;
								}
							}
							//如果只回收死進程,而當(dāng)前進程為激活的窗口的話,則不關(guān)閉
							if((_phandle)&&((int)process.MainWindowHandle!=0))
							{
								_kill=false;
							}
 
							//如果可以回收則在文本框中添加回收狀態(tài),并將進程關(guān)閉
							if(_kill)
							{
								if(!process.HasExited)
								{
									if(ref_act=="kill")
									{
										//								MessageBox.Show("has exited");
										_killstate=close_tip+".進程"+_pname+"已被回收,關(guān)閉策略為"+ref_cl+",動作為:"+ref_act+"。進程的啟動時間為"+
											_pdatetime.ToString()+",檢測時間為:"+_checktime.ToString()+
											",現(xiàn)已經(jīng)超時"+(_dd.TotalSeconds-_gcSpan).ToString()+
											"秒,回收時間單位是"+_gcSpan.ToString()+"秒。"+
											"進程ID:"+process.Id.ToString()+
											"進程主窗口句柄:"+process.MainWindowHandle.ToString();
										process.Kill();
										richTextBox1.AppendText(_killstate+"\r\n");
									}
									if(ref_act=="command")
									{
										//								MessageBox.Show("has exited");
										string _return="";
										for(int st=0;st<ref_cmd1.GetLength(0);st++)
										{
											_return+=ref_cmd1[st]+" Result:"+WinExec(ref_cmd1[st],0).ToString()+"↙";
										}
										_killstate=close_tip+".進程"+_pname+"已被回收,關(guān)閉策略為"+ref_cl+",動作為:"+ref_act+",執(zhí)行了命令:"+
											ref_cmd1+"。返回值為:"+_return+"。進程的啟動時間為"+
											_pdatetime.ToString()+",檢測時間為:"+_checktime.ToString()+
											",現(xiàn)已經(jīng)超時"+(_dd.TotalSeconds-_gcSpan).ToString()+
											"秒,回收時間單位是"+_gcSpan.ToString()+"秒。"+
											"進程ID:"+process.Id.ToString()+
											"進程主窗口句柄:"+process.MainWindowHandle.ToString();
										richTextBox1.AppendText(_killstate+"\r\n");
										//										process.Kill();
									}
									//清空當(dāng)前進程檢測數(shù)組元素
									_processid[_curpoint]=0;
									_processLastTime[_curpoint]=_checktime;
									_processLastMem[_curpoint]=0;
									_processLastCPU[_curpoint]=null;
								}//判斷進程是否已經(jīng)退出
							}
						}//if proecess
						else //如果沒有找到進程名稱,則二次判斷任務(wù)是否提供了啟動命令,如果提供,則運行它
						{
						}//end find process name
					}//li
				}//for
			processes = System.Diagnostics.Process.GetProcesses(); //獲得當(dāng)前進程組
			for(int ali=0;ali<listBox1.Items.Count;ali++)
			{
				_rv=listBox1.Items[ali].ToString().Split('|');
				string ref_process=_rv[0].ToLower().Trim();
				int ref_span=int.Parse(_rv[1].ToString());
				string ref_cl=_rv[2].ToLower().Trim();
				float ref_rank=float.Parse(_rv[3].ToString());
				string ref_stdtime=_rv[4].ToLower().Trim();
				string ref_act=_rv[5].ToLower().Trim();
				string[] ref_cmd1=_rv[6].Split('↙');
				string ref_start_cmd=_rv[7];
				string[] ref_cmd2=_rv[7].Split('↙');
				bool _find=false;
				if(ref_start_cmd!="")
				{
					for(int i = 0;i<processes.Length-1;i++)
				    {
					  process= processes[i];  //獲得當(dāng)前進程
					  string cur_pname=process.ProcessName.ToLower();  //獲得進程名并轉(zhuǎn)為小寫
						if(cur_pname==ref_process)
						{
							_find=true;
						}
				    }
					if(!_find)
					{
						string _return="";
						for(int st=0;st<ref_cmd2.GetLength(0);st++)
						{
							_return+=ref_cmd2[st]+" Result:"+WinExec(ref_cmd2[st],0).ToString()+"↙";
						}
						_killstate="進程"+ref_process+"嘗試啟動,關(guān)閉策略為"+ref_cl+",動作為:"+ref_act+",啟動命令為:"+
							ref_cmd2+"。返回值為:"+_return+"。";
						richTextBox1.AppendText(_killstate+"\r\n");
					}
				}
			}//end for listbox
 
		}

小結(jié)

開發(fā)這款小工具,也是初識 System.Diagnostics(與系統(tǒng)進程、事件日志和性能計數(shù)器進行交互的類)的一個過程。

到此這篇關(guān)于基于C#實現(xiàn)進程回收管理工具的文章就介紹到這了,更多相關(guān)C#進程回收管理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c#基礎(chǔ)系列之ref和out的深入理解

    c#基礎(chǔ)系列之ref和out的深入理解

    有過C#基礎(chǔ)知識的都應(yīng)該清楚Ref和Out的使用方法,所以下面這篇文章主要給大家介紹了關(guān)于c#基礎(chǔ)系列之ref和out的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • 向一個數(shù)組中插入一個1~100的隨機數(shù)

    向一個數(shù)組中插入一個1~100的隨機數(shù)

    這篇文章主要介紹了如何向一個數(shù)組中插入一個1~100的隨機數(shù),思路很簡單,需要的朋友可以參考下
    2014-07-07
  • Unity PC版Log的具體位置介紹

    Unity PC版Log的具體位置介紹

    這篇文章主要介紹了Unity PC版Log的具體位置介紹,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • C# string轉(zhuǎn)換為幾種不同編碼的Byte[]的問題解讀

    C# string轉(zhuǎn)換為幾種不同編碼的Byte[]的問題解讀

    這篇文章主要介紹了C# string轉(zhuǎn)換為幾種不同編碼的Byte[]的問題解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • c#注冊客戶端事件示例

    c#注冊客戶端事件示例

    這篇文章主要介紹了c#注冊客戶端事件使用示例,大家參考使用吧
    2014-01-01
  • C#實現(xiàn)二叉排序樹代碼實例

    C#實現(xiàn)二叉排序樹代碼實例

    今天小編就為大家分享一篇關(guān)于C#實現(xiàn)二叉排序樹代碼實例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • c#事件使用示例詳解

    c#事件使用示例詳解

    這篇文章主要介紹了c#事件使用方法,下面我們利用一個例子來加深我們對事件的理解,需要的朋友可以參考下
    2014-04-04
  • C# Winform截圖指定控件范圍內(nèi)的圖像的流程步驟

    C# Winform截圖指定控件范圍內(nèi)的圖像的流程步驟

    工作所需,需要截圖軟件跑出來的界面上的圖表,但是窗口本身是可以縮放的,圖表也是做的可以跟著窗體大小一起縮放,所以就寫了一個函數(shù),用于截圖圖表容器內(nèi)的圖像,文中有函數(shù)源碼供大家參考,需要的朋友可以參考下
    2024-10-10
  • C#中字符串分割的多種方式

    C#中字符串分割的多種方式

    在C#編程語言中,字符串處理是日常開發(fā)中不可或缺的一部分,字符串分割是處理文本數(shù)據(jù)時常用的操作,它允許我們將一個長字符串分解成多個子字符串,本文給大家介紹了C#中字符串分割的多種方式,需要的朋友可以參考下
    2025-01-01
  • C#實現(xiàn)將PDF轉(zhuǎn)為Excel的方法詳解

    C#實現(xiàn)將PDF轉(zhuǎn)為Excel的方法詳解

    通常,PDF格式的文檔能支持的編輯功能不如office文檔多,針對PDF文檔里面有表格數(shù)據(jù)的,如果想要編輯表格里面的數(shù)據(jù),可以將該PDF文檔轉(zhuǎn)為Excel格式。本文將介紹如何利用C#實現(xiàn)PDF轉(zhuǎn)Excel,需要的可以參考一下
    2022-04-04

最新評論