Autor Wątek: Natychmiastowe zakańczanie wątku.  (Przeczytany 1611 razy)

Offline Likassono

  • Użytkownik

# Sierpień 22, 2012, 17:10:33
Cześć, przy okazji pisania gry Multiplayer natknąłem się na dosyć poważny błąd. Po kliknięciu "zamknij" aplikacja zamyka się, ale jeden wątek wciąż działa, wątek wygląda mniej więcej tak:

        while (!Game1.exit)
        {
            bytesRead = 0;

            try
            {
                bytesRead = networkStream.Read(message, 0, 4096);
            }
            catch
            {
                break;
            }
            if (bytesRead == 0)
                break;

            ASCIIEncoding encoder = new ASCIIEncoding();
            OnMessageRecieved.OnMessage(encoder.GetString(message, 0, bytesRead));
        }

        client.Close();

Wątek zatrzymuje się na networkStream.Read();
I teraz mam pytanie, czy da się zakończyć ten wątek, podczas działania tej funkcji? A może są jakieś inne rozwiązania tego problemu?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Fiołek

  • Użytkownik
    • Blog

# Sierpień 22, 2012, 17:17:24
Od .NET 4.5 istnieje ReadAsync, który przyjmuje CancellationToken, wcześniej możesz się bawić w BeginRead/EndRead. Możesz też wykorzystać Thread.Abort, ew. przerzucić się na non-blocking sockets(google it).

Offline Xion

  • Moderator
    • xion.log

# Sierpień 23, 2012, 11:13:58
@up. Thead.Abort wygląda na radykalną metodę przerwana wątku który jest CPU-bound. Wątek OP spędza większość czasu czekając na I/O, więc Thread.Interrupt wydaje się bardziej adekwatnym rozwiązaniem.

Offline Avaj

  • Użytkownik

# Sierpień 23, 2012, 15:59:51
ja bym poszukał jakiegoś Selecta żeby nie siedzieć czekając aż coś przyjdzie tylko odpytywać czy coś jest.