» »

[C#] - .ocx, Access violation

[C#] - .ocx, Access violation

tx-z ::

Uporabljam neko knjižnico, ki pa mi povzroča težave. Namreč to knjižnico uporabljam v webservisu in ko recimo 3-10x kličem webservis (torej se 3-10x instancira) mi javi sledečo napako:

Exception - System.Runtime.InteropServices.COMException (0xFFFFFFFF): Error. [Access violation at address 043B9FEC in module 'sdk.ocx'. Read of address 000000F9]

sdk.ocx ni thread safe. Kako rešiti to zadevo? Uporabljam .asmx webservis. Hvala za odgovore!
tx-z
  • spremenilo: tx-z ()

mihies ::

Opusti OCX :)

Mogoče naredi nit, ki edina dostopa do tega OCX-a. Potem pa vse klice sinhroniziraj v to nit.
Kaj pa sploh dela omenjeni ocx?
http://blog.rthand.com/
SLODUG - uporabniška skupina
https://www.facebook.com/groups/slodug/

tx-z ::

Povezuje se z eno mssql bazo, ampak ne vem kaj dela v ozadju vse, zato sm primoran to uporabt. Kako bi pa to lahko naredu, kšni angleški search izrazi za googla?:)
tx-z

mihies ::

Tu imaš en primer z uporabo Task Parallel Library:

http://msdn.microsoft.com/en-us/library...

V bistvu potrebuješ potrošnika (consumer) in proizvajalca (producer). Drugi pošilja prvemu kaj mora delati, prvi pa te stvari (npr. v zanki) obdeluje v isti niti. Verjetno boš v tvojem primeru pošiljal neke instance tipa, ne pa niza bytov kot v primeru.

Npr. tvoj proizvajalec bo pripravil ukaz:
var ukaz = new Ukaz { Naredi = "to in to", ... };
ga poslal potrošniku
target.Post(ukaz)
in potrošnik ga bo v svoji zanki obdelal.

Seveda boš imel samo enega potrošnika (statični razred ali statična referenca).
Bo šlo? Če ne pa še vprašaj.
http://blog.rthand.com/
SLODUG - uporabniška skupina
https://www.facebook.com/groups/slodug/

Zgodovina sprememb…

  • spremenil: mihies ()

mihies ::

Po drugi strani pa, če je problem samo v temu, da niti ne smejo hkrati dostopati do tega OCX-a (in mu je vseeno s katere niti prifrči zahteva), lahko rešiš tudi z enostavnim zaklepanjem, i.e. vsak klic daš v lock:

lock (nekObjekt) {
 // kliči OCX
}


Moraš pa vedeti, da če se klic znotraj lock blokira, boš imel celo aplikacijo blokirano (pri klicanju OCXa).
http://blog.rthand.com/
SLODUG - uporabniška skupina
https://www.facebook.com/groups/slodug/

tx-z ::

Stvar sem zdej rešil s temle (dobil predlog od nekoga):
http://msdn.microsoft.com/en-us/library...

In stvar dela. S tem instanciram .ocx samo enkrat in potem vedno to instanco uporabljam. Še vedno pa zna pridt do tega da bi lih dva hkrati isto uporabljala, tako da moram nekak še celo funkcijo lockat.

Konkretno:
    public static SDK test;
    static Lazy<SDK> SDKConnection = new Lazy<SDK>(() =>
    {
        test = new SDK();
        test.Connect("key");
        return test;
    });



In potem samo uporabljam:
            SDK sdkInstanca = SDKConnection.Value;
tx-z

mihies ::

Lazy<T> ti omogoča, da si narediš instanco šele kadar jo potrebuješ in nič drugega (zato se imenuje Lazy) - s tem si skrajšaš čas zagona aplikacije nisi pa rešil klice v to instanco (kot si sam ugotovil).
Če te čas zagona ne moti, lahko enostavno narediš instanco v statičnem konstruktorju - med izvajanjem bo rahlo hitrejše kot preko Lazy<T>:

static ImeRazreda() {
  test = new SDK();
  test.Connect("key");
}
http://blog.rthand.com/
SLODUG - uporabniška skupina
https://www.facebook.com/groups/slodug/


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Notepad cleaner

Oddelek: Programiranje
6974 (859) Ziga Dolhar
»

C programiranje (strani: 1 2 3 )

Oddelek: Programiranje
14127710 (18006) amacar
»

C# WPF nalaganje info. iz XML dokumenta

Oddelek: Programiranje
61026 (846) MrStein
»

C# pomoč

Oddelek: Programiranje
111293 (935) mihies
»

C# web service in delovanje

Oddelek: Programiranje
61413 (1275) Looooooka

Več podobnih tem