Socket, odbieranie asynchroniczne i problem z wywołaniem zdarzenia

Odpowiedz Nowy wątek
2011-09-04 19:20
0

Cześć.

Właśnie tworzę sobie aplikacje na WP7.1 i mam problem z Socketem, a dokładniej próbą wywołania zdarzenia po odebraniu pakietu. Podczas wywołania zdarzenia i próby przetworzenia danych dostaję error: ".NET Compact Framework does not support invoking delegates asynchronously" Aby dokładniej zilustrować problem pokażę kod helpera do socketa jak i klasy, która z tegoż helpera korzysta. Exception, który pojawia się także został oznaczony w miejscu występowania

Helper do Socketa:

public class ClientSocket3
    {
        Socket _socket;
 
        private const int ConnectionTimeout = 5000;
        private static ManualResetEvent connectedDone = new ManualResetEvent(false);
 
        public OnReceiveHandler3 OnReceive
        {
            get;
            set;
        }
 
        public void Connect(IPEndPoint endPointAddress)
        {
            _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 
            SocketAsyncEventArgs args = new SocketAsyncEventArgs();
            args.Completed += new EventHandler<SocketAsyncEventArgs>(args_Completed);
            args.RemoteEndPoint = endPointAddress;
            args.UserToken = _socket;
 
            _socket.ConnectAsync(args);
 
            if (connectedDone.WaitOne(ConnectionTimeout))
            {
 
            }            
        }
 
        void args_Completed(object sender, SocketAsyncEventArgs e)
        {
            if (e.LastOperation == SocketAsyncOperation.Connect)
            {
                connectedDone.Set();
 
                Debug.WriteLine("Połączono");
            }
            else if (e.LastOperation == SocketAsyncOperation.Receive)
            {
                if (OnReceive != null)
                {
                    OnReceive(this, null);
                }
            }
            else if (e.LastOperation == SocketAsyncOperation.Send)
            {
                Debug.WriteLine("Wysłano... Oczekuje odpowiedzi");
 
                _socket.ReceiveAsync(e);
            }
        }
 
        public void Send(byte[] data)
        {
            SocketAsyncEventArgs sendArgs = new SocketAsyncEventArgs();
            sendArgs.Completed += new EventHandler<SocketAsyncEventArgs>(args_Completed);
            sendArgs.SetBuffer(data, 0, data.Length);
 
            _socket.SendAsync(sendArgs);
        }
 
        public void Close()
        {
            _socket.Close();
        }
    }
 
    public delegate void OnReceiveHandler3(object sender, byte[] receivedData);

Klasa wykorzystująca:

class XYZ
{
        private ClientSocket3 client;
 
        public void Connect(IPEndPoint ipep)
        {
 
            try
            {
                client = new ClientSocket3();
                client.Connect(ipep);
                client.OnReceive += new OnReceiveHandler3(testReceived);
 
            }
            catch (SocketException se)
            {
                if (OnConnectFailed != null)
                    OnConnectFailed(se.ErrorCode);
            }
            catch
            {
                throw;
            }
        }
 
        private void Send(byte[] data)
        {
                _client.Send(data);
        }
 
        private void testReceived(object sender, byte[] e)
        {
                RecvData(e); **// tu wywala Exception: .NET Compact Framework does not support invoking delegates asynchronously**
        }
 
        private void RecvData(byte[] data) 
        { 
            //....
        }
}

Kod wywala się po otrzymaniu odpowiedzi do pakietu wysłanego za pomocą metody Send() klasy XYZ.

Kombinowałem z ThreadPool.QueueUserWorkItem() jak i System.Windows.Deployment.Current.Dispatcher.BeginInvoke() ale nie pomogły - albo źle je stosowałem, albo nie mogą one mi pomóc.

edytowany 5x, ostatnio: Ktos, 2011-09-04 20:21
Blah, nie umiem dobrze korzystać z tagów :/ - PcSA 2011-09-04 19:22

Pozostało 580 znaków

2011-09-05 09:51
0

Czego nie zrozumiałeś z ".NET Compact Framework does not support invoking delegates asynchronously"?
http://msdn.microsoft.com/en-us/library/2e08f6yc.aspx
Poczytaj o api w nowym WP czy generalnie o ograniczeniach w compact frameworku i będziesz wiedział.
Spróbuj może w osobnym wątku uruchomić operacje na socket, nie będziesz blokował głównego wątku. I normalnie użyj zdarzeń. Oczywiście RequiredInvoke w kontekście gui pewnie nadal trzeba stosować.

Pozostało 580 znaków

2011-09-05 10:17
0
massther napisał(a)

Czego nie zrozumiałeś z ".NET Compact Framework does not support invoking delegates asynchronously"?
http://msdn.microsoft.com/en-us/library/2e08f6yc.aspx
Poczytaj o api w nowym WP czy generalnie o ograniczeniach w compact frameworku i będziesz wiedział.
Spróbuj może w osobnym wątku uruchomić operacje na socket, nie będziesz blokował głównego wątku. I normalnie użyj zdarzeń. Oczywiście RequiredInvoke w kontekście gui pewnie nadal trzeba stosować.

Rozumiem treść błędu, nie wiem jak sobie z nim poradzić. Korzystanie z klasy Socket wymaga stosowania metod asynchronicznych. Nie ma np. Send() jest SendAsync() itd., a z tego co wiem wywołanie asynchroniczne z automatu tworzy osobny wątek do obsługi wywoływanej metody. Stąd też nie mam jak blokować głównego wątku aplikacji.

Co do RequiredInvoke istnieje z tego co pamiętam tylko w winFormsach, a nie w Silverlight czy WPF.

Link, który wstawiłeś odnosi się do "dużej" wersji .NET 4.0, a nie dla wersji CF. O ograniczeniach i sposobie rozwiązywania ograniczeń chętnie bym poczytał, ale nie doszukałem się nigdzie strony, na której mógłbym o czymś takim poczytać.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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