gpt4 book ai didi

wpf - 关于在 C# (WPF) 中对 COM 对象进行异步调用的问题

转载 作者:行者123 更新时间:2023-12-04 06:52:05 25 4
gpt4 key购买 nike

很抱歉问了这么一个基本问题,但我似乎对这个问题感到头晕目眩!我正在从我的 WPF 项目中调用一个 COM (ATL) 对象。 COM 方法可能需要很长时间才能完成。我想我会尝试异步调用它。我有几个演示行可以显示问题。

private void checkBox1_Checked(object sender, RoutedEventArgs e)
{
//DoSomeWork();
AsyncDoWork caller = new AsyncDoWork(DoSomeWork);
IAsyncResult result = caller.BeginInvoke(null, null);
}

private delegate void AsyncDoWork();
private void DoSomeWork()
{
_Server.DoWork();
}

ATL 方法 DoWork 非常令人兴奋。这是:
STDMETHODIMP CSimpleObject::DoWork(void)
{
Sleep(5000);
return S_OK;
}

我期望以这种方式运行会导致复选框被立即选中(而不是在 5 秒内),并且我能够在屏幕上移动 WPF gui。我不能 - 5 秒钟。

我究竟做错了什么?我敢肯定这很简单。委托(delegate)人签名错误?

谢谢。

最佳答案

我确定您对 ATL 代码的调用被编码到 GUI 线程是正确的,因为 ATL 代码是 STA,从而阻塞了您的 GUI 线程。

两种解决方案:

  • 将 ATL 部分重新架构为 MTA,这可能不可行,或
  • 将 ATL 保留为 STA,但最初在为此目的创建的线程中构造 COM 对象,因此它将获得不同的单元。

  • WPF 应用程序实际上可以通过多个 UI 线程正常运行,只要每个 UI 线程都管理自己的 UI 部分,并且这些部分由 HwndSource 分隔。换句话说,运行部分 UI 的第二个线程实现了一个 Win32 HWND,然后将其嵌入到由主线程运行的 UI 部分中。

    如果您的 COM 对象本身不是 GUI 对象,那么在单独的工作线程中构造它并将其留在那里应该很容易。由于它是一个 STA 对象,所有调用都将被编码到另一个线程。

    关于wpf - 关于在 C# (WPF) 中对 COM 对象进行异步调用的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2968820/

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