gpt4 book ai didi

.net - 将 WPF(需要 STAThread)与无法与 STAThread 配合使用的 API 结合使用

转载 作者:行者123 更新时间:2023-12-02 13:44:25 24 4
gpt4 key购买 nike

我正在编写一个 WPF 应用程序,该应用程序对具有简单要求的 API 具有可选依赖项;它必须在没有 STAThread 属性的线程上初始化/使用。当然,WPF 需要 STA,这样一切就变得简单了。

在这种情况下,无论如何都需要 WPF。仅当用户选择在应用程序中启用此功能时,才需要此第三方 API。这意味着一旦需要调用其他 API,WPF 应用程序就已经在运行。

如果你没有用[STAThread]修饰你的main方法,它会自动成为一个MTA线程吗?在这种情况下,这是否意味着我可以创建一个新的 MTA 线程并在其上使用其他 API?

如果这可行,那么我猜想来自此 API 的任何事件都可以使用 Dispatcher 与 WPF 应用程序通信(用于引发需要在 UI 等中显示的事件)。但是,是否有一种简单的方法可以让我的 WPF 应用程序“调用”MTA 线程上的功能来进行 API 调用?

在 MTA 中,我想每个线程都应该能够处理状态,但我想我的 STA 线程(WPF 应用程序)不能只是“进入”MTA 线程并执行 API 调用?

这里很可能会造成混淆,因此我希望获得一些关于如何设计这样的东西的意见!

谢谢!

[7 月 8 日编辑]

好吧,我在上面混淆了一些概念。线程模型当然是针对一个PROCESS设置的,而不是针对每个线程设置的,而且这个第三方API不能与STA进程一起使用。

目前,我看到摆脱这种困惑的唯一方法是编写一个与该 API 通信的服务,然后使用命名管道与该服务通信。这根本不是小事,是一个丑陋丑陋的解决方法,但第三方 API 不在我的控制之下。这就是人生。 :|

最佳答案

外部 API 是 GUI API 吗?或者只是功能等?如果是后者,那么您可以生成第二个线程(可能使用生产者/消费者队列),即 MTA:

    Thread thread = new Thread(DoSomeStuff);
thread.SetApartmentState(ApartmentState.MTA);
thread.Name = "3rd aprty API spooler";
thread.Start();

关于.net - 将 WPF(需要 STAThread)与无法与 STAThread 配合使用的 API 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1031136/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com