Принудительно закрывает «мошеннические» потоки, если abort () не работает - PullRequest
2 голосов
/ 17 октября 2011

Как видно из названия.Да, я знаю, что ужасно использовать .abort (), но выслушайте меня

Я использую 2 потока: основной поток (моего приложения) и поток прослушивания сокета (знакомый звук кому-нибудь?) Вместоиспользуя асинхронные вызовы .AcceptAsync () (tbh, основная причина в том, что я не слишком внимательно их изучал), у меня поток просто зависает на 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 (как предложено в других темах форума), однако это не имеет никакого значения.

1 Ответ

1 голос
/ 18 октября 2011

Поскольку вы уже используете поток, вы можете просто использовать 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 и EndAccept поток может быть повторно использован для другой обработки. Поскольку вы не используете его для каких-либо целей во время ожидания соединения, удержание потока довольно бессмысленно и неэффективно.

...