проблема производительности aspcompat - PullRequest
0 голосов
/ 10 мая 2009

Я использую атрибут страницы aspcompat в ASP.NET, чтобы вызываемые компоненты 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. Если я добавлю 10000 элементов в приложение, то для завершения записи потребуется десять секунд, а 60000 => timeout.

Кажется, что когда я впервые прикасаюсь к любому внутреннему объекту, среда выполнения делает что-то неприятное, чтобы сделать объекты доступными для COM.

Вы когда-нибудь видели это? Любое предложение высоко ценится.

1 Ответ

0 голосов
/ 10 мая 2009

Это почти наверняка проблема с многопоточностью, возможно, когда Interop выполняет переключение контекста потока при каждом вызове от компонента VB к классам в контексте.

Я не эксперт здесь, так что я могу (вероятно, поправлюсь), но я считаю, что вам нужно убедиться, что ваш компонент VB также является STA, как страница ASP.NET, помеченная наборами aspcompat = true Это. Если вы храните все компоненты в одном потоке, переключений контекста не будет (что требует очень дорогой сортировки).

...