استفاده از ماژول ASP.net برای اشکال زدایی فراخوانی های Async

دوشنبه 19 بهمن 1394

در این مقاله قصد داریم درباره ماژولی صحبت کنیم که اشکال زدایی برنامه ها را بر عهده دارد . با استفاده از آن می توان طول عمر وظایف را پیگیری کرد.

استفاده از ماژول  ASP.net برای اشکال زدایی فراخوانی های Async

در این مقاله قصد داریم درباره ماژولی صحبت کنیم که اشکال زدایی برنامه ها  را بر عهده دارد . با استفاده از آن می توان طول عمر وظایف را پیگیری کرد.

یک برنامه داریم که در آن از کلمه های کلیدی 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  فعالی مشاهده نشود. اگر زمانی مشکل مشابهی داشتید این ماژول را درون پروژه خود کپی کنید.

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید