2012-10-26 64 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属性。

想象一下如果可以暂停这个过程会发生什么。用户点击按钮,你的程序会暂停当前进程,而不是无关紧要,因为你只是暂停了一下。终止进程的代码永远不会运行。

相关问题