【发布时间】:2014-02-14 20:44:07
【问题描述】:
抱歉无法发布任何代码示例(我还不能提炼成一个小的、可重现的代码库,而且我拥有的代码是专有的)。
我的情况是这样的:我有一个使用 Excel DNA 开发的 Excel 加载项,它从需要身份验证的 REST Web 服务中提取数据。加载项按会话存储凭据,但不会在 Excel 实例之间保留。还存在一个向用户公开的宏,允许他们调用加载项中的代码以从 Web 服务中提取数据。
如果用户以前没有登录过,我们会弹出一个 Windows 窗体对话框,要求提供凭据。这工作正常。成功登录后,我们的逻辑开始(在一个测试中,有 6 个并发请求)从 Web 服务中提取数据。有一点来回(请求数据,它是未经授权的,登录,再次请求,拉数据等)。如果登录以编程方式发生(没有显示或实例化 Windows 窗体),则一切正常。
我看到的问题是,当涉及 Windows 窗体时,我看到授权请求和取回数据之间存在 1 分钟 29 秒的延迟(加/减几分之一秒)。此延迟最终导致 Excel 对话框:“microsoft excel 正在等待另一个应用程序完成 ole 操作”。另一个奇怪的事情是我们所做的一切实际上都成功地发生了,用户刚刚得到这个对话框并且必须点击“确定”(并且经历了不必要的延迟)。
所有迹象都表明延迟发生在客户端。如果我完全删除了 Windows 窗体登录对话框,我们不会看到任何延迟,并且所有操作都已完成,并且在 excel 中根本没有任何提示。
一时兴起,我完全删除了使用实际凭据进行提示的代码,并硬编码了我们测试帐户的凭据。而且,它工作正常。如果我采用完全相同的代码并仅实例化一个空白 Windows 窗体,即 new System.Windows.Forms.Form(); 并且不对其执行任何操作,我会在我们的请求中获得完全相同的行为,一切都会阻塞 1 分 29 秒。然后,我们的请求成功了,但是客户端得到了前面提到的 Excel 对话框。
我们还通过功能区控件公开了完全相同的功能,可以正常工作,唯一的两个区别是:1. 不涉及宏,2. 我们在工作进行时显示进度对话框。
我们已验证所有 UI 元素都在 Excel 主线程上呈现/处理,并且我们不做任何与 Excel 交互的操作,除了在主线程上。没有引发异常(在调试器下运行时验证,所有异常都抛出中断)。
我以为我们做错了什么,直到我实例化了一个空白的 Windows 窗体(请注意 - 它甚至从未显示,只是实例化)并且我可以重现该行为。
有没有人看到这个或知道如何解决?
【问题讨论】:
标签: c#-4.0 excel excel-2013 vba