簡體   English   中英

套接字,異步數據接收和調用方法異常

[英]Socket, asynchronous data receiving and exception while invoking method

我正在嘗試為即時消息傳遞實現某種協議,所以我在使用Socket類。 當Socket從服務器接收到任何數據包時,我試圖觸發一個事件,該事件通知我的其他類有一些數據要使用。 但是,當我嘗試從事件處理程序的方法調用方法時,出現錯誤:“。NET Compact Framework不支持異步調用委托”

這是我正在使用的一些代碼。 我在發生異常的地方留言。

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("Connected");
        }
        else if (e.LastOperation == SocketAsyncOperation.Receive)
        {
            if (OnReceive != null)
            {
                OnReceive(this, null);
            }
        }
        else if (e.LastOperation == SocketAsyncOperation.Send)
        {
            Debug.WriteLine("Sent... Waiting for answer");

            _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);
 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)
                {
                    // todo
                }
                catch
                {
                    throw;
                }
            }

            private void Send(byte[] data)
            {
                    _client.Send(data);
            }

            private void testReceived(object sender, byte[] e)
            {
                    RecvData(e); **// here exception is thrown: Exception: .NET Compact Framework does not support invoking delegates asynchronously**
            }

            private void RecvData(byte[] data) 
            { 
                //....
            }
    }

從XYZ類調用Send()方法后,立即引發異常。 當然,在發送任何內容之前,我會調用Connect方法,因此我已連接到服務器。

我曾嘗試使用ThreadPool.QueueUserWorkItem()和System.Windows.Deployment.Current.Dispatcher.BeginInvoke(),但沒有運氣-也許我以錯誤的方式使用它們。

任何想法如何解決這個問題? 提前致謝。

更新 ;

異常-堆棧:

   at Test.IM.XYZ.testReceived(Object sender, Byte[] e)
   at Test.Net.ClientSocket3.args_Completed(Object sender, SocketAsyncEventArgs e)
   at System.Net.Sockets.SocketAsyncEventArgs.OnCompleted(SocketAsyncEventArgs e)
   at System.Net.Sockets.SocketAsyncEventArgs.OnCompletedInternal(SocketAsyncEventArgs e)
   at System.Net.Sockets.SocketAsyncEventArgs.FinishOperationSuccess(SocketError socketError, Int32 bytesTransferred, SocketFlags flags)
   at System.Net.Sockets.Socket.AsyncCallback(IAsyncResult ar)
   at System.Net.LazyAsyncResult.InvokeCallback(Boolean asyncCompletion)
   at System.Net.Sockets.Socket.SocketAsyncRequestManager.WorkerThread.doWork()
   at System.Net.Sockets.Socket.SocketAsyncRequestManager.WorkerThread.doWorkI(Object o)
   at System.Threading.ThreadPool.WorkItem.WaitCallback_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)

異常類:System.NotSupportedException。

在數據中是System.Collections.ListDictionaryInternal但計數為0

我不確定如何解決此特定問題,但是出於您的目的,您可能需要查看與7.1一樣屬於lib的UdpSingleSourceMulticastClient。

參見msdn: http : //msdn.microsoft.com/zh-cn/library/system.net.sockets.udpsinglesourcemulticastclient( v=vs.95) .aspx

祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM