gpt4 book ai didi

c# - 使用在主线程中创建的 COM 对象无阻塞地运行一段代码

转载 作者:太空宇宙 更新时间:2023-11-03 22:03:41 25 4
gpt4 key购买 nike

我有一个慢速方法,我想在单独的线程中运行。此方法调用在应用的主线程中创建的 COM 对象。

让我们假设慢的代码是这样的:

var bwImg = image.GetBitonalImage(); // <- slow image is a COM created in main thread
viewer.Document = bwImg; // <-- ATL control accepting the B/W COM image

如果这很重要,我在 WPF 应用程序中执行此操作,“查看器”在 WinFormsHost 中。

我假设这样做会使它异步并且不会阻止应用程序的运行:

var t = new Thread((ThreadStart)(() =>
{
var bwImg = image.GetBitonalImage(); // <- this is in separate thread
Dispatcher.Invoke((Action)(() =>
{
viewer.Document = bwImg; // <- this again on the main
}));
}));
t.Start();

对我来说,图像在稍后显示是可以的,我不在乎延迟多少时间。

但恰好应用程序以同样的方式被阻止。我做了分析,实际上大部分时间都花在了 GetBitonalImage 上,几乎没有花在“viewer.Document = bwImg”上。

完全删除代码会使应用程序响应,因此这不是其他代码错误。

此后还有其他代码使用相同的图像 COM 对象(不是黑白结果,而是原始结果)。

这是执行此操作的正确方法吗?问题可能是因为 COM 对象方法调用吗?

最佳答案

您的 COM 对象是线程安全的吗?如果不是,那么它可能会在 STA(单线程单元)模式下初始化,这将使用 STA 线程来完成它的工作。因此,即使您启动了一个新线程,它也会切换回 STA 线程,从而阻止您的 UI 事件。如果您可以控制 COM 库的源代码,您可以更改这些设置,只要代码实际上是线程安全的即可。

编辑:在相关帖子部分找到此链接,它可能适用于您。 UI thread is blocking a background thread calling a COM object .

关于c# - 使用在主线程中创建的 COM 对象无阻塞地运行一段代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9199871/

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