在 C# 中告诉窗口从线程关闭
本文关键字:线程 窗口 | 更新日期: 2023-09-27 18:37:05
我在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);
}
我收到一个错误,告诉我无法从此线程访问 DialogResult,我知道我的"acceptCallback"函数是从异步运行 accept 的线程调用的,但真的不知道如何获得我想要的行为。
如何从此回调中告诉主线程它应该以正确的方式关闭对话框窗口?
通常只能从 UI 线程访问 UI 元素(作为对话框窗口对象)。
只需使用 UI 元素的Dispatcher
即可完成此操作:
void acceptCallback(IAsyncResult iar)
{
socket = listenSocket.EndAccept(iar);
Dispatcher.Invoke(() =>
{
DialogResult = true;
Close();
});
}
如果是 .NET 4.0 或更低版本,则必须从 lambda 表达式显式创建Action
:
Dispatcher.Invoke(new Action(() =>
{
DialogResult = true;
Close();
}));
或
Dispatcher.Invoke((Action)(() =>
{
DialogResult = true;
Close();
}));