0

我开发了一个套接字程序。我有客户端套接字程序的问题,它一次从多个服务器获取数据并更新列表视图中的详细信息。它发生在无限循环中。

while(true) 
{

}

我想在中间阶段退出这个循环,我使用按钮点击事件来做到这一点

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

但它太慢了,我想暂停那个过程并杀死它。帮我暂停当前正在运行的进程。

4

5 回答 5

0

没有暂停运行进程的功能,所以答案是否定的。

如果这是可能的,您可以更改每个流程,这是所有软件构建者都试图阻止的事情。

你需要一些方法。

但是,如果您有时间可以尝试 http://www.c-sharpcorner.com/uploadfile/mmehta/multithreading311162005045743am/multithreading3.aspx

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

于 2012-10-26T05:50:02.553 回答
0

如果您想同时处理多个套接字连接,我建议使用SocketAsyncEventArgs而不是传统的while (true).

看看这篇文章:

通常循环附带的最简单(但并非完美)的解决方案while是这样的:

private volatile bool _running = true;

...

while (_running)
{
    // Do stuff
}

...

public void ButtonClick(object sender, EventArgs e)
{
    _running = false;
}
于 2012-10-26T05:59:15.827 回答
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();
}
于 2012-10-26T06:17:33.617 回答
0

根据您的应用程序(多少线程,什么 ui 库),您可以只使用 Application.Exit。也许您应该在创建工作线程时设置它们的IsBackground属性。

想象一下会发生什么,如果可以暂停该过程。用户单击按钮,您的程序暂停当前进程,然后无事可做,因为您只是暂停了自己。杀死进程的代码永远不会运行。

于 2012-10-26T06:35:43.233 回答
0

您可以挂起远程进程的所有线程。

http://www.codeproject.com/Articles/2964/Win32-process-suspend-resume-tool

于 2012-10-26T07:37:43.497 回答