Pergunta

Estou a ter alguns problemas com a concorrência quando utilizar DLLImport, eu tenho uma Dll que fornece alguns relatórios preciso enviar para a web, então eu tenho isso:

[DllImport("Rep.dll", EntryPoint = "PrintRep", CallingConvention = CallingConvention.StdCall, 
CharSet = CharSet.Ansi)]
private static extern string PrintRep(several params...);

E sobre a Dll lado há muitas variáveis e instâncias que, em seguida, devolve um caminho com o relatório.

O código que eu tenho agora, tem um bloqueio em torno da chamada de PrintRep, que funciona, mas, obviamente, faz solicitações pendentes de esperar, há uma maneira para que isso funcione sem um bloqueio?Porque se eu tirar o bloqueio de eu ter vários "Tentativa para escrever na memória protegida" erros e a Dll eventualmente trava.

Foi útil?

Solução

É o relatório DLL thread-safe?Eu vou acho que não, já que você disse que se você remover o bloqueio, em seguida, você obter erros.Então, você tem duas opções, fazer a DLL thread-safe (exige fonte e altera a dll antigo), ou serializar os pedidos para a DLL, o que você fez.Essas são as únicas duas opções.No entanto, você precisa para fazer o seu blog aguardar o relatório correta, então?Você pode, talvez, manter uma lista de usuários de espera para o relatório e os parâmetros necessários para a chamada e, em seguida, retornar a página para o usuário deixá-los saber que você vai enviar um e-mail o relatório.Em seguida, você pode processar os relatórios de maneira serial, enquanto não fazendo com que o seu blog para aguardar o resultado.

Outras dicas

Se todos solicitações da web estão esperando com base nesta chamada, você deve considerar a possibilidade de telefonar isso em um thread separado, mantendo-se o bloqueio, e fazendo apenas o PrintRep chamada solicitante aguardar a chamada para retornar para esperar.

Se apenas as pessoas de espera para o PrintRep chamada para concluir, são aqueles de espera, não há muito que você pode fazer, fora da implementação de algum tipo de servidor-lado da fila de trabalho, e levar os usuários a retornar para verificar a fila de alguma forma, talvez através de um temporizador de retorno de chamada AJAX.

O que quer que você faça, evite chamar isso em qualquer thread do conjunto de threads.ASP.Net usa os para lidar com solicitações de página.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top