我开发了一个套接字程序。我遇到客户端套接字程序的问题,它从多个服务器获取数据,一次一个,并更新listview中的详细信息。它发生在无限循环中。
while(true)
{
}
我想在中期退出这个循环,我使用按钮点击事件来做那个
foreach (Process myProc in Process.GetProcesses())
{
if (myProc.ProcessName == "procees name")
{
myProc.Kill();
}
}
但它太慢了,我想暂停这个过程并杀死它。帮我暂停当前正在运行的过程。
答案 0 :(得分:0)
暂停运行过程没有这样的功能,所以答案是否定的。
如果可以,您可以更改每个流程,这是所有软件构建商都试图阻止的。
你需要一些方法。
但是,如果你有时间可以试试 http://www.c-sharpcorner.com/uploadfile/mmehta/multithreading311162005045743am/multithreading3.aspx
http://www.codeproject.com/Articles/2042/Using-events-for-thread-synchronization
答案 1 :(得分:0)
如果您想要处理多个同时套接字连接,我建议您使用SocketAsyncEventArgs而不是传统的while (true)
。
看一下这篇文章:
while
循环通常带来的最简单(但不完美)的解决方案是这样的:
private volatile bool _running = true;
...
while (_running)
{
// Do stuff
}
...
public void ButtonClick(object sender, EventArgs e)
{
_running = false;
}
答案 2 :(得分:0)
由于您提到该流程是您自己的应用程序,您可以自行退出应用程序而不是终止应用程序。你的问题更多的是“如何退出我的程序”。
首先,由于您运行的是无限循环,因此您的按钮似乎无法响应。这样做的一种(坏)方式是这样的:
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();
}
答案 3 :(得分:0)
根据您的应用程序(多少个线程,ui库),您可以使用 Application.Exit。也许您应该在创建工作线程时设置IsBackground属性。
想象一下如果可以暂停这个过程会发生什么。用户单击该按钮,您的程序将暂停当前进程,而无需执行任何操作,因为您只是暂停了自己。杀死进程的代码永远不会运行。
答案 4 :(得分:0)