我在ASP.NET中使用aspcompat页面属性,因此我调用的com组件可以获取ASP内部对象(请求,响应,应用程序等)
我已经快速创建了一个新的测试项目,一个asp.net页面和一个vb6 com组件。
页面执行此操作:
for (int i = 0; i < 1000; i++)
Application["string" + i] = i.ToString();
Debug.WriteLine(string.Format("{0} done adding strings to app",Environment.TickCount));
var asp = new ASPTest.CompClass();
asp.SetProcessId();
基本上我在应用程序对象中添加了东西,然后调用了com组件。
Set context = GetObjectContext
If Not context Is Nothing Then
Set app = context("Application")
Set ses = context("Session")
Set resp = context("Response")
If Not app Is Nothing Then
OutputDebugString "" & GetTickCount & " writing response"
resp.Write "I see application from vb <br/>"
OutputDebugString "" & GetTickCount & " before "
For i = 100 To 200
resp.Write GetTickCount & " i = " & app("string" & i) & "<br/>"
Next
OutputDebugString "" & GetTickCount & " after "
End If
Else
OutputDebugString "No context"
End If
问题是我在应用程序中放的东西越多,vb代码变得越慢。不是所有的代码,只是当我第一次尝试在内部对象上调用任何方法时,在我的例子中我的第一个resp.Write调用。如果我在app resp.Write中添加10000个项目需要十秒钟才能完成,60000 =&gt;超时。
当我触摸任何内部对象时,运行时第一次做了令人讨厌的事情,使对象可用于COM。
你见过这个吗?任何建议都非常感谢。答案 0 :(得分:0)
这几乎可以肯定是线程问题,可能是Interop执行线程上下文切换,每次调用VB组件到上下文中的类。
我不是这里的专家,所以我可能(可能会)得到纠正,但我相信您需要确保您的VB组件也是STA,就像标有aspcompat = true集的ASP.NET页面一样它。如果将所有组件保留在同一个线程中,则不会有任何上下文切换(需要非常昂贵的编组)。