c#从后台线程关闭WPF表单

本文关键字:WPF 表单 线程 后台 | 更新日期: 2023-09-27 17:49:00

我正在寻找一种方法来关闭一个窗体从后台线程。场景:它是一个聊天应用程序,在后台有一个线程来管理TCP客户端现在我想关闭这个线程的第一个表单

App.xaml.cs

public List<Window> dialogs = new List<Window>();
protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);
    Login loginDialog = new Login();
    GUI.MainWindow mainDialog = new GUI.MainWindow();
    dialogs.Add(loginDialog);
    dialogs.Add(mainDialog);
    client = new Klassen.TClient(dialogs);
    if (loginDialog.ShowDialog() != true)
        return;
}
TClient类
public class TClient
{
    public TSocket socket;
    public TClient(List<Window> dialogs)
    {
        socket = new TSocket(dialogs);
    }
}

TSocket类,带有后台线程

public class TSocket
{
    /* Variables */
    List<Window> dialogs;
    public TSocket(List<Window> dialogs)
    {
        this.dialogs = dialogs;
        clientThread = new Thread(connectionWorker);
        clientThread.Start();
    }
    public bool connect()
    {
        /* Connect */
    }
    void connectionWorker()
    {
        connect();
        while (isConnected)
        {
            /* if statment */
            Login loginDialog = (Login)dialogs[0];
            //dialogs[1].Close();
        }
    }
}

我已经尝试使用委托和调用,但它不能正常工作

c#从后台线程关闭WPF表单

Windows编程只允许使用主UI头进行UI操作。

    static class UiUtils
    {
    static UiUtils()
    {
        Dispatcher = Application.Current == null
            ? null
            : Application.Current.Dispatcher;
    }
    public static Dispatcher Dispatcher { get; private set; }
    public static void InvokeMainThread(this Action action)
    {
        try
        {
            if (Dispatcher != null && !Dispatcher.CheckAccess())
                Dispatcher.Invoke(action);
            else
                action();
        }
        catch(Exception ex)
        {
            Debug.WriteLine("Error invoking main thread: {0}", ex);
        }
    }
}

在你的代码中,你应该从任何线程调用:

UiUtils.InvokeMainThread(()=>{loginDialog.Close();});`