استفاده از ماژول ASP.net برای اشکال زدایی فراخوانی های Async
دوشنبه 19 بهمن 1394در این مقاله قصد داریم درباره ماژولی صحبت کنیم که اشکال زدایی برنامه ها را بر عهده دارد . با استفاده از آن می توان طول عمر وظایف را پیگیری کرد.
در این مقاله قصد داریم درباره ماژولی صحبت کنیم که اشکال زدایی برنامه ها را بر عهده دارد . با استفاده از آن می توان طول عمر وظایف را پیگیری کرد.
یک برنامه داریم که در آن از کلمه های کلیدی async و await استفاده شده است. برنامه احتمالا با یک پاسخ کند ناشی از انتظار فراخوانی دیتابیس مواجه خواهد شد. ما یک debugger را به برنامه اضافه میکنیم. هرچند چیزی در این روند در حال اجرا نیست (تصویر شماره 1) اما انتظار می رود فراخوانی ها async باشند و thread های انتظار طولانی نشوند.
ندیدن کدهای اجرایی در هنگام اشکال زدایی برنامه ها با استفاده از متدهای asynchronous خسته کننده است.
معرفی TPLEventListenerModule
NET framework. سورس رویدادی را تعریف کرد با نام TplEtwProvider که باعث راه اندازی رویدادهایی می شود که اجازه پیگیری طول عمر وظایف را به ما می دهد. در اینجا یک HttpModule ، TPLEventListenerModule ایجاد کردیم که شامل یک رویداد Listener به رویداد TPL است. Listener دو نوع از رویداد TPL را می گیرد : TaskWaitBeing و TaskWaitEnd . پس از گرفتن یک رویداد، Listener اطلاعات وظیفه انجام شده را در حافظه ذخیره میکند مانند id وظیفه انجام شده ، StackTrace جایی که رویداد اتفاق افتاده است ، زمان ایجاد رویداد ،نوع رویداد و ... . ماژول تضمین میکند که Listener در طول رویداد BeginRequest درخواست ها ، مقداردهی اولیه شده است. یک HttpHandler برای نمایش اطلاعات ذخیره شده ایجاد کردیم . اطلاعات وظیفه انجام شده همچنین می تواند توسط API قابل دسترس باشد .
توضیحاتی درباره ماژول پیوست شده به این مقاله :
1. این ماژول یک ASP.net HttpModule است. برای استفاده از آن فقط کافی است که آن را در Web.config برنامه خود ثبت کنیم . بخشی که به Web.config اضافه می شود ، کدی شبیه به کد زیر است :
<system.webServer> … <modules> <add name="TPLEventListenerModule" type="TaskEventListenerModule.TPLEventListenerModule, TaskEventListenerModule"/> </modules> … </system.webServer>
2. اطلاعات ضبط شده رویداد به دو روش زیر ذخیره می شود :
هر نمونه HttpContext یک نمونه SingleRequestTaskStore دارد که اطلاعات task فعال جاری را برای درخواست های متناظر ذخیره میکند.
هر نمونه HttpContext یک DebuggingInfoList شامل همه رویدادها برای درخواست های متناظر را دارد .
3. ماژول در درخواست های رویداد BeginRequest/EndRequest هر درخواست HttpContext را در/از یک ConcurrentItemStore قرار میدهد/حذف میکند .
4. یک HttpHandler ، ViewAsyncTaskInfoHandler نوشتیم . handler یک نما از همه درخواست های فعال و همه اطلاعات وظیفه های نا همزمان را که وجود دارند به ما میدهد. برای فعال کردن Handler در برنامه خود در Web.Config بخشی مانند زیر را اضافه میکنیم.
<system.webServer> … <handlers> <add type="TaskEventListenerModule.ViewAsyncTaskInfoHandler, TaskEventListenerModule" name="ViewAsyncTaskInfoHandler" resourceType="Unspecified" path="vat.axd" verb="POST,GET,HEAD"></add> </handlers> … </system.webServer>
صفحه Default موجود در برنامه پیوست شده دو لینک با نام های Async Page و View Async Tasks دارد . می توانید بر روی Async Page چند بار کلیک کنید سپس بر روی View async Tasks کلیک کنید. صفحه View Async Tasks لیستی از درخواست های وظایف ناهمزمان در حال اجرا را نشان خواهد داد .
با TPLEventListenerModule در اینجا ، اکنون میدانیم کدام وظیفه نا همزمان درخواست ما در حال انتظار است حتی اگر thread فعالی مشاهده نشود. اگر زمانی مشکل مشابهی داشتید این ماژول را درون پروژه خود کپی کنید.
- ASP.net
- 1k بازدید
- 2 تشکر