0

私はソケットプログラムを開発しました。一度に1つずつ複数のサーバーからデータを取得し、リストビューで詳細を更新するクライアント側ソケットプログラムに問題があります。無限ループの中で発生します。

while(true) 
{

}

このループを途中で抜けたいのですが、ボタンクリックイベントを使用してそれを行いました

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

しかし、遅すぎるので、そのプロセスを一時停止して強制終了したいと思います。現在実行中のプロセスを一時停止するのを手伝ってください。

4

5 に答える 5

0

プロセスは独自のアプリケーションであると述べているので、アプリケーションを強制終了する代わりに、自分でアプリケーションを終了することができます。あなたの質問は、「どうすればプログラムを終了できますか」ということになります。

まず、無限ループを実行しているため、ボタンが応答しないように見える場合があります。それを行う1つの(悪い)方法は次のようなものです:

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

複数の同時ソケット接続を処理したい場合は、従来の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

リモート プロセスのすべてのスレッドを中断できます。

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

于 2012-10-26T07:37:43.497 に答える
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

アプリケーション (スレッドの数、UI ライブラリの種類) によっては、 Application.Exitを使用できます。おそらく、ワーカー スレッドを作成するときにIsBackgroundプロパティを設定する必要があります。

プロセスを一時停止できたらどうなるか想像してみてください。ユーザーがボタンをクリックすると、プログラムは現在のプロセスを一時停止します。自分自身を一時停止しただけなので、何もする必要はありません。プロセスを強制終了するコードは実行されません。

于 2012-10-26T06:35:43.233 に答える