告诉窗口关闭C#中的一个线程

时间:2013-10-27 17:06:47

标签: c# wpf callback

我在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的线程调用的,但是我真的不知道如何获取行为我想。

如何从这个回调中告诉主线程它应该以正确的方式关闭对话框窗口?

1 个答案:

答案 0 :(得分:6)

您通常只能从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();
}));