Потоковый стандартный вывод из DLL на веб-клиента - PullRequest
1 голос
/ 08 октября 2011

У меня есть DLL, которая может генерировать изображение на основе определенного ввода. Изображение может быть экспортировано в файл или на стандартный вывод. Я хочу создать веб-приложение, которое будет показывать это изображение, поэтому я создал обработчик, который выполняет импорт DLL и показывает изображение. Это работает в первый раз, но потом по какой-то очень странной причине я не могу прочитать во второй раз вывод из stdout с помощью AnonymousPipeServerStream.

Код:

Dim oContext As HttpContext = CType(oOBject, HttpContext)
Dim iLength As Integer = 0

Using oServer As New IO.Pipes.AnonymousPipeServerStream(IO.Pipes.PipeDirection.Out, IO.HandleInheritability.None, 6562038)
    Dim defaultHandle As IntPtr = GetStdHandle(STD_OUTPUT_HANDLE)
    SetStdHandle(STD_OUTPUT_HANDLE, CType(oServer.SafePipeHandle.DangerousGetHandle, IntPtr))
    Dim x = Err.LastDllError
    Try
        Dim i As Integer = fnImageConverter() 'THIS IS THE DLL FUNCTION WHICH WRITES TO STDOUT
    Catch ex As Exception

    End Try

    Using oClient As New IO.Pipes.AnonymousPipeClientStream(IO.Pipes.PipeDirection.In, oServer.ClientSafePipeHandle)
        Using oReader As New IO.BinaryReader(oClient)
            oServer.Flush()
            While (iLength < 6562038) 'TODO, size to read.

                Dim aValue As Byte = oReader.ReadByte()
                oContext.Response.OutputStream.WriteByte(aValue)
                iLength += 1
            End While
        End Using
    End Using
    SetStdHandle(STD_OUTPUT_HANDLE, defaultHandle)
    x = Err.LastDllError

    oServer.DisposeLocalCopyOfClientHandle()
    oServer.Close()
End Using

Это отлично работает с первого раза. Во второй раз (например, когда клиент нажимает кнопку обновления) он зависает на собственном коде за «oReader.ReadByte ()».

Я надеюсь, что кто-то может мне помочь. Я действительно долго смотрю и не могу найти правильное решение. Я могу изменить DLL, но немного. Я должен использовать точку, совместимую с (FILE *), такую ​​как stdout, и я должен быть очень быстрым ...

И еще один вопрос (за который я боюсь за ответ): Путем перенаправления stdout в поток канала, это только для currentThread или для всех потоков. Другими словами: если браузеры будут вызывать этот обработчик одновременно, как отреагирует система? Каждый звонок выполняется в отдельном потоке ...

Это сводит меня с ума.

С уважением,

1018 * Кристоф *

...