2012-10-26 103 views
0

我開發了一個套接字程序。我有客戶端套接字程序的問題,它從多個服務器獲取數據,一次一個,並更新列表視圖中的細節。它發生在無限循環內。如何暫停當前正在運行的進程

while(true) 
{ 

} 

我想退出這個這個循環中,中期,我用按鈕單擊事件要做到這一點

foreach (Process myProc in Process.GetProcesses()) 
{ 
    if (myProc.ProcessName == "procees name") 
    { 
     myProc.Kill(); 
    } 
} 

但它太慢了,我想暫停這一進程,並殺死它。幫我暫停當前正在運行的進程。

+2

你的意思是暫停一個線程? –

+0

我想暫停線程並殺死它..我認爲它會比直接查殺更快地退出此應用程序 – user1776177

+1

殺死進程不是正確的方法。過程是你自己的過程嗎?或者它是一個單獨的應用程序? – nawfal

回答

0

既然你提到的過程是你自己的應用程序,你可以直接退出應用程序而不是kil處理應用程序。你的問題更多的是「我怎樣才能退出我的計劃」。

首先,由於您運行的是無限循環,因此您的按鈕可能看起來並不敏感。這樣做的一個(壞)的方式是這樣的:

private bool _exit = false; //member variable 
while(true && !_exit) 
{ 
    Application.DoEvents(); 
} 

Application.DoEvents重要的是使你的應用程序繼續聽其他動作。然後,

private void btn_Click(object sender, EventArgs e) 
{ 
    _exit = true; 
} 

imo的理想方法是將從服務器獲取數據的工作轉移到後臺進程。可能是這樣的:

BackgroundWorker _backgroundWorker = new BackgroundWorker(); //member field 

void Listen() 
{ 
    _backgroundWorker.WorkerSupportsCancellation = true; 
    _backgroundWorker.WorkerReportsProgress = true; 
    _backgroundWorker.DoWork += (sender, e) => { while(condition)//bla bla; } 
    _backgroundWorker.RunWorkerAsync(); 
} 

然後在您的取消點擊,

private void btn_Click(object sender, EventArgs e) 
{ 
    _backgroundWorker.CancelAsync(); 
} 
+0

爲什麼'while(true &&!_exit)'而不只是'while(!_ exit)'?爲什麼要測試負值,同時可以恢復命名約定並測試正值而不使用'!'? –

+0

'while(true)'是OP給出的循環。我正在給它增加一個附加條件。基本上我試圖告訴OP:「使用任何你可能喜歡的條件,但增加一個」。我不認爲'在OP(真)'的生產代碼中,更多的是在這裏提出的一個問題。所以我正在回答同一行。我不認爲它值得投票。 – nawfal

+0

我不知道有多少混亂的'!'符號可以。如果它適合你,我懷疑你是一個好的程序員。我的邏輯很簡單。循環通過,直到滿足退出條件。現在在按鈕上單擊我可以設置:'exit = true',這很直接。無論哪種方式它是一個微不足道的主題,即使是反對投票:) – nawfal

0

沒有這樣的功能來暫停運行過程,所以答案是否定的。

如果這是可能的,你可以改變每一個進程,這是所有軟件開發者試圖阻止的。

您需要一些解決方法。

不過,如果你有時間,你可以嘗試 http://www.c-sharpcorner.com/uploadfile/mmehta/multithreading311162005045743am/multithreading3.aspx

http://www.codeproject.com/Articles/2042/Using-events-for-thread-synchronization

+1

這個答案是錯誤的。從www.sysinternals.com安裝Process Explorer並右鍵點擊一個進程 - >暫停。 – Elmue

0

如果要同時處理多個socket連接,我建議使用SocketAsyncEventArgs,而不是傳統的while (true)

看看這篇文章:

而這通常是與while循環最簡單的(但並非無懈可擊)解決方案是這樣的:

private volatile bool _running = true; 

... 

while (_running) 
{ 
    // Do stuff 
} 

... 

public void ButtonClick(object sender, EventArgs e) 
{ 
    _running = false; 
} 
+0

這不會工作,除非你有Application.DoEvents – nawfal

+0

事實上,只要'while'循環不在UI上,但它是工作的,而工作線程。我以爲原來的問題就是這樣。 –

+0

嗯。因爲OP在談論動作變慢,所以我認爲它可能是UI線程。 – nawfal

0

根據您的應用程序(多少線程,什麼UI庫),你可以只使用 Application.Exit。也許你應該在創建工作線程時設置IsBackground屬性。

想象一下如果可以暫停這個過程會發生什麼。用戶點擊按鈕,你的程序會暫停當前進程,而不是無關緊要,因爲你只是暫停了一下。終止進程的代碼永遠不會運行。

相關問題