2

タイトルが示すように。はい、.abort()を使用するのは恐ろしいことですが、聞いてください

非同期の.AcceptAsync()呼び出しを使用する代わりに、(アプリの)メインスレッドとソケットリッスンスレッド(おなじみのサウンドはありますか?)の2つのスレッドを使用しています(主な理由は、あまり調べていないことです)それら)、私はスレッドをsocket.Accept();にぶら下げています。もちろん、thread.Abort()を呼び出すと、接続を待機しているためスレッドは閉じません。Accept()を通過すると、正常に中止されます。

コード:

    void listenserver()
    {
        while (run)
        {
            fConsole.WriteLine("Waiting for connections..");
            connectedsock = mainsock.Accept();
            connected = true;
            fConsole.WriteLine("Got connection from: " + connectedsock.RemoteEndPoint);

...そして他の場所:

    private void button_start_Click(object sender, EventArgs e)
    {
        if (!run)
        { //code ommitted.
        }
      else
        {
            run = false;
            listenthread.Join(3000);
            if (listenthread.IsAlive)
            {
                fConsole.WriteLine("Force-closing rogue listen thread");
                listenthread.Abort();
            }
            button_start.Text = "Start";
            groupBox_settings.Enabled = true;
        }

別のアプリにすべてを詰め込んで終了するのではなく、スレッドが終了することを保証する方法はありますか?(他のフォーラムスレッドで提案されているように)thread.IsBackgroundがtrueに設定されていることに注意してください。ただし、違いはありません。

4

1 に答える 1

1

すでにスレッドを使用しているので、を使用することもできますBeginAccept。次のようなラムダを使用できるため、非同期コードでコードを複雑にする必要はありません。

var socket = new Socket(...);

socket.BeginAccept(result =>
{
    if (this.abort)
    {
        // We should probably use a signal, but either way, this is where we abort.
        return;
    }

    socket.EndAccept(result);
    // Do your sockety stuff
}, null);

の個別のメソッド定義があってもAsyncCallback、コードは複雑ではありません。

BeginAccept非同期IOを実行することにより、との呼び出しの間EndAcceptにスレッドを他の処理に再利用できるため、CPU時間の効率も大幅に向上します。接続を待っている間は目的のある目的で使用していないため、スレッドを保持することは非常に無意味で非効率的です。

于 2011-10-18T07:03:54.180 に答える