我在WPF工作,我有一个启动监听套接字的对话窗口,并且应该在有人连接时立即关闭.这是我天真的,非工作的代码段:
void acceptCallback(IAsyncResult iar)
{
socket = listenSocket.EndAccept(iar);
DialogResult = true; // error here
Close();
}
private void ValidButton_Click(object sender, RoutedEventArgs e)
{
IPEndPoint iep = new IPEndPoint(IPAddress.Any, port);
listenSocket.Bind(iep);
listenSocket.Listen(1);
listenSocket.BeginAccept(acceptCallback, null);
}
Run Code Online (Sandbox Code Playgroud)
我得到一个错误,告诉我无法从这个线程访问DialogResult,我知道我的"acceptCallback"函数是从异步运行accept的线程调用的,但是我真的不知道如何获得我想要的行为.
如何从这个回调中告诉主线程它应该以正确的方式关闭对话框窗口?
您通常只能从UI线程访问UI元素(作为对话框窗口对象).
这只需使用DispatcherUI元素完成:
void acceptCallback(IAsyncResult iar)
{
socket = listenSocket.EndAccept(iar);
Dispatcher.Invoke(() =>
{
DialogResult = true;
Close();
});
}
Run Code Online (Sandbox Code Playgroud)
如果是.NET 4.0或更低版本,则必须Action从lambda表达式显式创建:
Dispatcher.Invoke(new Action(() =>
{
DialogResult = true;
Close();
}));
Run Code Online (Sandbox Code Playgroud)
要么
Dispatcher.Invoke((Action)(() =>
{
DialogResult = true;
Close();
}));
Run Code Online (Sandbox Code Playgroud)