タイトルが示すように。はい、.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に設定されていることに注意してください。ただし、違いはありません。