Brak wywołania metody w klasie przypisanej do delegata

0

Witam

Mam problem. Pewnie głupi i wyjdzie tutaj moja nieznajomość C#, ale ciężko nazwać mi ten problem i tym samym ciężko jest znaleźć rozwiązanie.

Mianowicie nie wykonuje mi się metoda EndReading() .
Gdy trzymam całą zawartość klasy w Main() to działa idealnie, jednak jeśli wyodrębnię tę część kodu do klasy, to już nie działa.

 
class Connected
{
            //<--------Reszta kodu


     public void BeginReading()
        {
                ns.BeginRead(
                buffer, bytesRead, bufferSize - bytesRead,
                new AsyncCallback(EndReading),ns);
        }

     public void EndReading(IAsyncResult ar)
        {

            //numberOfBytesRead = ns.EndRead(ar);
            //bytesRead += numberOfBytesRead;

            returndata = System.Text.Encoding.ASCII.GetString(buffer);

        }
}

Wywołanie metod odbywa się w Main().

0

nie działa

To znaczy co: nie kompiluje się, kraszuje, zawiesza, nic się nie dzieje a coś powinno...

0

Podczas debugowania:

komarekzm napisał(a):

Mianowicie nie wykonuje mi się metoda EndReading() .

Nie działa wtedy i tylko wtedy, jak mam te metody w klasie.
Jeśli mam wrzucone metody w Maina to działa prawidłowo, wszystko się kompiluje i robią to co powinny.

I pytanie dlaczego tak się dzieję ?
Z czego to wynika ?
Z jakiś ograniczeń delegatów ?

0

Posiedziałem trochę przy kodzie i doszedłem do ciekawych wniosków. Kod działa prawidłowo kiedy włączy się debuggera i w odpowiednim miejscu postawi breakpoint. Wtedy wykonując kod krok po kroku wykonuje się też EndReading() . Pewnie ma to związek z wątkami. Niżej wrzucam całą klasę

class Connected 
    {
        TcpClient s = new TcpClient();
        NetworkStream ns;

        private string returndata;
        private XElement xml = new XElement("connect",
           new XAttribute("userid", "----"),
           new XAttribute("hashid", "--------------------"),
           new XAttribute("gamemode", "1"));        

        public void Connect()
        {
            s.Connect("codearena.pl", 7654);
         
            ns = s.GetStream();
            byte[] outStream = System.Text.Encoding.ASCII.GetBytes(xml.ToString());
            ns.Write(outStream, 0, outStream.Length);
            ns.Flush();

            Start();
        }

        // Size of receive buffer.
        public const int bufferSize = 8192;
        // Receive buffer.
        public byte[] buffer = new byte[bufferSize];
        int bytesRead;
        int numberOfBytesRead;

        public void Start()
        {
            buffer = new byte[bufferSize];
            bytesRead = 0;
            BeginReading();
        }

        public void BeginReading()
        {
 //breakpoint           this.ns.BeginRead(
                 buffer, bytesRead, bufferSize - bytesRead,
                 new AsyncCallback(EndReading),
                 ns);
        }

        public void EndReading(IAsyncResult ar)
        {
            numberOfBytesRead = ns.EndRead(ar);
            bytesRead += numberOfBytesRead;

            returndata = System.Text.Encoding.ASCII.GetString(buffer);
        }
 

     
    }
 

2 ciekawostka

Kod wyżej wrzucony do buttona1. Działa poprawnie wtedy kiedy pod returndata umieszcze jakieś przypisanie wartości z returndata do textBoxa.text np.

public void EndReading(IAsyncResult ar)
        {
            
            numberOfBytesRead = serverStream.EndRead(ar);
            bytesRead += numberOfBytesRead;

            returndata = System.Text.Encoding.ASCII.GetString(buffer, 0, bytesRead)

            textBox2.Invoke(new Action(delegate()
            {
                textBox2.AppendText("New message...");
                textBox2.AppendText(Environment.NewLine);
            }));
            textBox1.Invoke(new Action(delegate()
            {
                textBox1.Text=(returndata);
            }));
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1