Problema de performance com o Interop (.NET para VB6)

5 views
Skip to first unread message

Junglist

unread,
Dec 14, 2009, 8:23:08 AM12/14/09
to ccppbrasil
Ola pessoal !
Estou tendo problemas de performance com o Interop.
Criei uma DLL no C# que expoe um evento que é consumido por um client
feio em VB6

Funciona normal, mas percebi um problema de performance. O Aplicativo
fica muito pesado, consumindo muito processamento quando eu chamo o
evento 1000 vezes por segundo. O processamento chega a 100%.

O estranho é que eu nao fiz nenhuma implementação na chamada do evento
no lado do VB6, ou seja, o problema esta no Interop do .NET mesmo.

Meu PC é um Intel Core2 - 1,86GHz, 2GB de memoria - Windows XP
Professional
Estou desenvolvendo em Visual Studio 2005 Professional Edition, .NET
Framework 2.0.50727
E para fazer o aplicativo estou usando o Visual Studio 6 (SP6)

Essa é a minha interface de evento que aparece para o VB6:

[Guid("6027F32B-9360-4615-9EFC-A6043806E64A")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface BovespaEvents
{
void UpdateNotify(string strategyname, string symbolname,
string fieldname, float fieldvalue);
}

Esse é o metodo que eu uso a interface

public void UpdateEvent(DataObject sender)
{
try
{
UpdateNotify(sender.strategy, sender.symbol,
sender.field, sender.value);
}
catch (Exception err)
{
LogError("UpdateEvent", err.Message);
if (err.InnerException != null)
{
LogError("UpdateEvent",
err.InnerException.Message);
}
}
}


E esse é a classe DataObject:

[Serializable()]
public class DataObject
{
public string strategy;
public string symbol;
public string field;
public float value;

~DataObject()
{
}

}

E no VB6, o metodo que a DLL chama dentro do aplicativo:

Private Sub myInteropClient_UpdateNotify(ByVal strategyname As String,
ByVal symbolname As String, ByVal fieldname As String, ByVal
fieldvalue As Single)
'
' sem implementacao, so para testes de performance
'
End Sub

Alguem ai sabe pq esta tao lento ?

Obrigado pela ajuda

Emerson de Freitas Barcelos

unread,
Dec 14, 2009, 1:42:45 PM12/14/09
to ccppb...@googlegroups.com
Você espera ter mais de um cliente recebendo eventos no mesmo processo ?
Se não, ao invés de utilizar eventos (e toda a bagagem necessária para fazer isso funcionar), utilize interfaces (ComInterfaceType.InterfaceIsUnknown para não correr o risco de se fazer chamadas late-bound).

Já considerou o uso de C++/CLI ao invés de COM Interop ?
Dá um pouco mais de trabalho (chamar código em VB6 usando ATL), mas vc tem controle
do código gerado (pelo menos no lado nativo)
A propósito, alguém já viu algum comparativo entre C++/CLI vs COM Interop ?

Sds,
Emerson

De: Junglist <brunov...@gmail.com>
Para: ccppbrasil <ccppb...@googlegroups.com>
Enviadas: Segunda-feira, 14 de Dezembro de 2009 11:23:08
Assunto: [ccppbrasil] Problema de performance com o Interop (.NET para VB6)
--
Antes de enviar um e-mail para o grupo leia:
http://www..ccppbrasil.org/wiki/Lista:AntesdePerguntar
--~--~---------~--~----~------------~-------~--~----~
C/C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
Para mais opções, visite http://groups.google.com/group/ccppbrasil
--~--~---------~--~----~------------~-------~--~----~
Emprego & carreira:  vag...@ccppbrasil.org
http://groups.google.com/group/dev-guys?hl=en


Veja quais são os assuntos do momento no Yahoo! + Buscados: Top 10 - Celebridades - Música - Esportes

Junglist

unread,
Dec 16, 2009, 1:06:20 PM12/16/09
to ccppbrasil
Nao entendi bem a sua pergnuta do processo Emerson...
E o que é late-bound e early-bound ? como isso pode atrapalhar na
performance ?

Cara, usar o C++ foi a primeira coisa que eu pensei... mas fazer algo
em C++ significa, sempre, gastar 10x mais tempo e ter 20x mais
trabalho... Sou a unica pessoa codando, logo, usar C++ nao é
factivel...

On Dec 14, 4:42 pm, Emerson de Freitas Barcelos
<emerson_frei...@yahoo.com.br> wrote:
> Você espera ter mais de um cliente recebendo eventos no mesmo processo ?
> Se não, ao invés de utilizar eventos (e toda a bagagem necessária para fazer isso funcionar), utilize interfaces (ComInterfaceType.InterfaceIsUnknown para não correr o risco de se fazer chamadas late-bound).
>
> Já considerou o uso de C++/CLI ao invés de COM Interop ?
> Dá um pouco mais de trabalho (chamar código em VB6 usando ATL), mas vc tem controle
> do código gerado (pelo menos no lado nativo)
> A propósito, alguém já viu algum comparativo entre C++/CLI vs COM Interop ?
>
> Sds,
> Emerson
>
> ________________________________
> De: Junglist <brunovell...@gmail.com>
> Antes de enviar um e-mail para o grupo leia:http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar
> --~--~---------~--~----~------------~-------~--~----~
> C/C++ Brasil -http://www.ccppbrasil.org/
> Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
> Para mais opções, visitehttp://groups.google.com/group/ccppbrasil
> --~--~---------~--~----~------------~-------~--~----~
> Emprego & carreira:  vaga...@ccppbrasil.orghttp://groups.google.com/group/dev-guys?hl=en
>
>       ___________________________________________________________________________­_________
> Veja quais são os assuntos do momento no Yahoo! +Buscadoshttp://br.maisbuscados.yahoo.com
Reply all
Reply to author
Forward
0 new messages