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.