Silverlight的Socket.ConnectAsync方法从不调用Completed事件 - 我使用的是127.0.0.1:4510。我已将IIS配置为在端口943上提供clientaccesspolicy.xml文件。
我正在使用以下代码:
SocketAsyncEventArgs args = new SocketAsyncEventArgs();
//args.UserToken = tcp;
args.RemoteEndPoint = ep;
args.Completed += new EventHandler<SocketAsyncEventArgs>(OnConnect);
mrEvent.Reset();
bool x = tcp.ConnectAsync(args);
mrEvent.WaitOne();
private void OnConnect(object sender, SocketAsyncEventArgs e)
{
isConnected = (e.SocketError == SocketError.Success);
mrEvent.Set();
}
从不调用OnConnect方法,因此由于WaitOne方法而导致代码块。
注意:此代码正在后台线程上执行,因此WaitOne调用没有死锁。
答案 0 :(得分:1)
我有一个类似的问题,我刚才解决了;我在寻找答案时看到了你的帖子,并认为我最好分享,即使这是一个老帖子。即使你已经过了这个问题,其他人也会发现这个帖子。
我以为我的事件处理程序也没有解雇。原来它是WAS,但它是在后台线程上触发,不会影响用户界面。解决方案是确保处理程序在用户界面线程上触发。使用CheckAccess,如果它不在主线程上,则使用Dispatcher.BeginInvoke将其发送到那里。
希望这有帮助!
答案 1 :(得分:0)
Silverlight异步套接字API(唯一可用的)非常糟糕。
在您的情况下,如果从ConnectAsync
返回的值为false
,则调用是同步的,并且未调用OnConnect
方法。
以下是ConnectAsync
的同步版本:
public static bool Connect(this Socket socket, EndPoint remoteAddress) {
ManualResetEvent semaphore = new ManualResetEvent(false);
SocketAsyncEventArgs socketEventArgs = new SocketAsyncEventArgs() {
RemoteEndPoint = remoteAddress
};
socketEventArg.SetBuffer(buffer, 0, buffer.Length);
socketEventArg.Completed += (s, e) => {
semaphore.Set();
};
semaphore.Reset();
bool wasAsynchronous = socket.ConnectAsync(socketEventArgs);
if (wasAsynchronous) {
semaphore.WaitOne();
}
return socketEventArgs.SocketError == SocketError.Success;
}