ContextSwitchDeadlock was detected durumu

22 Ağu 2009 In: .net, ipucu
Eger Visual Studio ile debug yaparken aşagı daki hatayı alıyorsanız :

ContextSwitchDeadlock was detected
" CLR, 60 saniye içinde 0x46fae0 COM içeriğinden 0x46fc50 COM içeriğine geçemedi. Hedef içeriğe/gruba sahip olan iş parçacığı büyük olasılıkla pompalamayan bekleme yapıyor veya Windows iletileri pompalamadan çok uzun süreyle çalışan bir işlemi işliyor. Bu durum performansı genellikle kötü etkiler ve uygulamanın yanıt vermemesine veya bellek kullanımının zaman içinde sürekli artmasına neden olabilir. Bu sorunu önlemek için, tüm tek iş parçacıklı (STA) grup iş parçacıklarının bekleme komutları (örn. CoWaitForMultipleHandles) pompalaması ve uzun süre çalışan işlemler sırasında da düzenli olarak ileti pompalaması gerekir. "

Çözüm oldukca basit tek yapmanız gereken :

Debug -> Exceptions -> Managed Debug Assistants

altındaki ContextSwitchDeadlock check ini kaldırmak. CLR den kaynaklanan bu durum Release aşamasında tabii ki oluşmuyor.

Merhabalar, geçenlerde satın aldıgımız masaüstü RFID okuyucu ve yazıcısını hastane yazılımında SDK sını kullanmak istedigimizde, SDK içindeki API nin DLL inin C ile yazıldıgını fark ettik. Ve Visual Studio ya normal DLL i ekler gibi ekleyemedik.

Bende paylaşmak istedim, bu tarz başka dillerle yazılmış DLL leri P/Invoke ile kullanıyoruz projelerimizde. Bu tarz Win32 DLL lerini P/Invoke ile çagırabiliriz.

Bizim kullandıgımız masa üstü RFID okuyucusunun modeli TKP705 idi. Ama içerisinde bir Serial Reader var.  Windows cihazı HJSRFID-7640 ve HJSRFID-S7640 olarak tanımakta. Seri çevirici üzerinden USB RFID cihazı ile haberleşiliyor.

SDK içerisinden çıkan CVAPIV01.DLL C dili ile yazılmış. .Net projenizde kullanmak için DLL ile Bin klasorunun altına kopyalayıp.

        [DllImport("CVAPIV01.dll", CharSet = CharSet.Ansi)]

Deyip altınada kullanmak istedigimiz methodları tanımlıyoruz tek tek,

 

        public static extern int GetVersionAPI(StringBuilder VersionAPI);
        public static extern int OpenComm(StringBuilder Com, int Baudrate); 
...

Burada dikkat etmeniz gereken Win32 type lerini C# nasıl tanımlayacagınızı bilmeniz. Ve API içinde methodları parametreleri ile bilmeniz.Yukarıdaki 2 method için API nin SDK dökümanınında ( S795X-RS232 ) 

Şu şekilde ifade edilmişti :

int GetVersionAPI( char *VersionAPI )
int OpenComm(char *Com, int Baudrate)


kritik nokta türler, işte türlerin  listesi


Win32 Types Specification CLR Type
char, INT8, SBYTE, CHAR* 8-bit signed integer System.SByte
short, short int, INT16, SHORT 16-bit signed integer System.Int16
int, long, long int, INT32, LONG32, BOOL* , INT 32-bit signed integer System.Int32
__int64, INT64, LONGLONG 64-bit signed integer System.Int64
unsigned char, UINT8, UCHAR* , BYTE 8-bit unsigned integer System.Byte
unsigned short, UINT16, USHORT, WORD, ATOM, WCHAR* , __wchar_t 16-bit unsigned integer System.UInt16
unsigned, unsigned int, UINT32, ULONG32, DWORD32, ULONG, DWORD, UINT 32-bit unsigned integer System.UInt32
unsigned __int64, UINT64, DWORDLONG, ULONGLONG 64-bit unsigned integer System.UInt64
float, FLOAT Single-precision floating point System.Single
double, long double, DOUBLE Double-precision floating point System.Double
 

 

 

Ben Kimim ?

Celiker BahceciMerhabalar, ben Çeliker BAHÇECİ. 2004 den beri özel sektörde bilgisayar mühendisligi ve egitmenlik yapıyorum. Yine aynı yılın Ekim ayından beri sitemde .Net ile programlama ve hayat görüşüm ile ilgili makalelerimi yayınlıyorum. Blogum dışında Yazgelistir.com, mobilnedir.com gibi ineta kapsamındaki bir çok siteye Microsoft teknolojileri ile ilgili yazılar yazmaktayım.
Bu site ile sizinde hayatınızı anlamlandırmanızda bir parça katkımın olması dilegiyle...