【发布时间】:2011-02-27 11:16:30
【问题描述】:
很抱歉问了这么一个基本问题,但我似乎对这个问题感到头晕目眩!我正在从我的 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 秒钟。
我做错了什么?我敢肯定这很简单。委托人签名错误?
谢谢。
【问题讨论】:
-
我对此做了更多的思考和测试。我认为 C# 代码没有任何问题。当我用 private void DoSomeWork() { Thread.Sleep(5000); 替换 ATL 调用时一切正常。我认为发生的事情是 ATL 是一个 STA 对象。因此,即使调用最初是在工作线程上进行的,ATL 端的实际工作也是在主 GUI 线程上完成的。解决它的一种(痛苦的)方法是使 COM 组件成为 MTA。
标签: wpf com-interop atl