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();
}
}
}
我已经尝试使用委托和调用,但它不能正常工作
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();});`