مسیرراه‌ها
ASP.NET MVC
              بازخوردهای دوره
              استفاده از async و await در برنامه‌های ASP.NET Web forms 4.5
              - اعمال async با اعمال پس زمینه یکی نیستند. اعمال async واقعی از ترد استفاده نمی‌کنند؛ به همین جهت سربار کمی دارند و مقیاس پذیری سیستم را افزایش می‌دهند. زمانیکه از یک عملیات async استفاده می‌کنید، ترد جاری خالی می‌شود و به سرعت به thread pool، برای استفاده از آن جهت پردازش سایر درخواست‌های رسیده هدایت خواهد شد اما اعمال غیر async، ترد جاری را تا پایان پردازش معطل می‌کنند. این تفاوت اصلی و مهم کارهای async و غیر async است.
              - انتقال پارامترها به متدهای async مطابق روش C# 5، همانند قبل و مانند روش‌های متداول موجود است. هدف اصلی از طراحی async و await، عادی به نظر رسیدن این اعمال است؛ از دید برنامه نویس.
              در مثال بالا، متد public async Task LoadSomeData بدون پارامتر است. اگر نیاز به ارسال پارامتر به آن هست، از روش زیر استفاده کنید:
              RegisterAsyncTask(new PageAsyncTask(() => SomeMethod(param1: 1000)));
              اشتراک‌ها
              اضافه شدن قابلیت‌های AI به مرورگر Chrome به صورت آزمایشی (در نسخه‌ Canary/Dev)

              مرورگرها در آینده مجهز به AI میشن اصلی‌ترین دلیلش هم بحث privacy است؛ حین کار با LLMها مسئله امنیت داده‌ها موضوع به شدت مهمی است؛ روش‌های برای anonymise کردن ورودی‌های این LLMها قابل‌انجام است اما مسئله این است که اگر کانتکست کافی وجود نداشته باشد خروجی به آن اندازه‌ایی که انتظار داریم شاید مفید نباشد. مدتی است گوگل به صورت آزمایشی در حال اضافه کردن امکان استفاده از LLMها (در حال حاضر Gemini Nano) به مرورگر Chrome است. یکی دیگه از مزایای قراردادن LLMها درون مرورگر پاسخگویی سریع به درخواست‌ها می‌باشد در اینحالت دیگر نیاز به ارسال درخواست به یک Remote LLM کمتر خواهد شد؛ با پائین آمدن latency، کاربران تجربه نزدیک‌تر به real-time را احساس خواهند کرد. لازم به ذکر است این قابلیت به صورت آزمایشی و فعلاً در حد یک proposal میباشد و فقط در نسخه‌های Canary و Dev قابل استفاده میباشد.

              اضافه شدن قابلیت‌های AI به مرورگر Chrome به صورت آزمایشی (در نسخه‌ Canary/Dev)
              اشتراک‌ها
              معرفی کتابخانه FastMember برای کار با Reflection

              خیلی از مواقع ما نیاز داریم از Reflection استفاده کنیم اما Reflection به خودی خود نسبت به حالی عادی خیلی کندتر هست و نیاز به نوشتن کد‌های بیشتری دارد.

              برای سرعت بیشتر و استفاده راحت‌تر از Reflection میتونین از کتابخانه FastMember استفاده کنین. (بین تست‌های که شخصا داشتم تو سناریو‌های مختلف، FastMember بین 6 تا 96 برابر سریعتر از Reflection معمولی سریع‌تر بود.)

              مثلا برای دسترسی به property‌های یک object در runtime با کمک FastMember، خواهیم داشت:

              var accessor = ObjectAccessor.Create(obj);
              var propName = "MyProperty"
              var value = accessor[propName];

              نکته :

              این کتابخانه کد‌ها IL برنامه رو در runtime تغییر میده، در نتیجه در محیط‌های AOT (مخفف Ahead of Time) مانند Xamarin iOS کار نخواهد کرد.


              در مقاله زیر که مقاله جالبی هست توضیح میده، رفلکشن چطور کار میکنه و چرا کند هست

              سپس به روش‌های افزایش پرفرمنس رفلکشن اشاره میکنه و در آخر بنچمارکی از نتیجه اونها رو نشون میده

              Why Reflection Is Slow  

              معرفی کتابخانه FastMember برای کار با Reflection
              نظرات مطالب
              پردازش‌های Async در Entity framework 6
              - Task.Factory.StartNew و یا نمونه‌ی جدید آن یعنی Task.Run، نباید در اکشن متدهای MVC حضور داشته باشند. چون هر اکشن متد، در یک ترد جداگانه اجرا می‌شود و متدهای یاد شده هم یک ترد مجزای دیگر را ایجاد می‌کنند. بنابراین با اینکار، قابلیت پاسخ‌دهی برنامه را به نصف کاهش می‌دهید (نیاز به یک ترد برای اجرای اکشن متد + یک ترد برای اجرای Task.Run). هدف اصلی از اعمال async، عدم استفاده از یک ترد جدید است و آزاد سازی ترد جاری تا قدرت پاسخ‌دهی برنامه افزایش یابد. همچنین اجرای یک Task، در تردی دیگر، دسترسی آن‌را به HttpContext قطع می‌کند که با اعمال async واقعی، چنین مشکلی وجود ندارد و همه چیز طبیعی به نظر می‌رسد.
              - روش ارسال Taskهای Async به یک متد به این صورت است: « یک نکته‌ی تکمیلی: امضای نگارش‌های Task دار و Async این متدها» 
              + اگر هدفتان لاگ کردن خطاها است، در MVC استفاده از روش‌های کار با filterها، قابلیت انجام چنین کاری را بدون تکرار کد، میسر می‌کنند.
              نظرات مطالب
              ساخت ربات تلگرامی با #C
              سلام
              شما کلا از چند طریق میتوانید  داده‌های خودتون رو به بات ارسال کنید
              1. از طریق تایپ و ارسال عادی متن که سمت سرور می‌توانید متن رو بگیرید و سمت سرور روش شرط بذارید.
              2. از طریق KeyboardButton  که دکمه‌هایی هستند زیر بات میان و می‌توانید با کلیک بر روی هر دکمه، نوشته داخل دکمه رو ارسال کنید که شبیه روش ۱ فقط با دکمه انجام میشه 
              3. ازطریق InlineKeyboardButton که دکمه‌های شیشه‌ای هستند و در محیط چت نمایش داده میشوند که میتوان با کلیک بر روی هر دکمه، مقداری را که پشت پرده ست کردید، بفرستید.
              طوری که من سوال شمارو فهمیدم شما با هرکدام از روش‌های بالا داده را به سرور بفرستید داخل سرور باید روی متن رشته‌ای فرستاده شده شرط بذارید و طبق شرطتون داده را مجدد برای کاربر بفرستید.
              همچنین میتوانید این مقاله را هم مطالعه نمائید.
              نظرات مطالب
              نوشتن Middleware سفارشی در ASP.NET Core
              یکی از روش‌های مقابله با مشکل فوق استفاده از کلاس SemaphoreSlim می باشد که در NET Framework 4.0 معرفی شده و در فضای نام  System.Threading در دسترس می‌باشد.
              اگر اکشن متد‌های شما به صورت async await ایجاد کرده اید بهتر هست  ابتدا کلاس زیر را ایجاد نمایید:
              using System;
              using System.Threading;
              using System.Threading.Tasks;
               
              namespace MyApp
              {
                  public class AsyncLock : IDisposable
                  {
                      private SemaphoreSlim _semaphoreSlim = new SemaphoreSlim(1, 1);
               
                      public async Task<AsyncLock> LockAsync()
                      {
                          await _semaphoreSlim.WaitAsync();
                          return this;
                      }
               
                      public void Dispose()
                      {
                          _semaphoreSlim.Release();
                      }
                  }
              }
              سپس به صورت زیر از آن استفاده کنید:
              private static readonly AsyncLock _mutex = new AsyncLock();
               
              using(await _mutex.LockAsync())
              {
                  // Critical section... You can await here!
              }
              در این صورت تمامی درخواست‌های به سمت سرور به ترتیب اجرا خواهند شد و دیگر مشکل فوق را نخواهیم داشت.
              نظرات مطالب
              ارتقاء به ASP.NET Core 2.0 - معرفی بسته‌ی Microsoft.AspNetCore.All
              امکان اجرای درون پروسه‌ای در نگارش 2.2 میسر هست و دقیقا جزئی از بسته‌ی هاستینگ آن است (لینک مطرح شده‌ی در نظر فوق قدیمی است). فقط در این حالت ممکن است برنامه مسیرهای فایل‌های مشخص شده‌ی در آن را پیدا نکند. باید با دستور dotnet ./proj.dll برنامه را اجرا کنید (و یا یکی از روش‌های مطرح شده‌ی در مطلب «بررسی خطاهای ممکن در حین راه اندازی اولیه برنامه‌های ASP.NET Core در IIS») و دقیقا مشاهده کنید که مشکل از کجاست. چند مثال از این نوع:
              هر دو مورد به این اشاره می‌کنند که در نگارش فعلی این ماژول درون پروسه‌ای، متد Directory.GetCurrentDirectory بجای اینکه مسیر برنامه را باز گرداند، مسیر C:\windows\system32\inetsrv یا همان پروسه‌ی IIS را بر می‌گرداند و باید به این موضوع دقت داشت.  
              نظرات مطالب
              ارتقاء به ASP.NET Core 1.0 - قسمت 19 - بومی سازی
              راه حل توکاری ندارد؛ چون این فناوری سمت سرور است. حتی Razor هم یک فناوری سمت سرور است. بنابراین یا باید وقت بگذارید این روش‌های قدیمی را به جدید ترجمه کنید:
              و یا یک تامین کننده‌ی منابع عمومی اسکریپت‌ها را تعریف کنید:
              <script type="text/javascript">
              if (!window.resourceProvider) {
                  window.resourceProvider = {
                      message1: '',
                      message2: ''
                  };
              }
              </script>
              سپس در View باید این کلیدها را بر اساس سرویس سمت سرور بومی سازی، مقدار دهی کنید:
              @using Microsoft.AspNetCore.Mvc.Localization
              @inject IViewLocalizer Localizer
              
              @section Scripts
              {
                <script type="text/javascript">
                  resourceProvider.message1 = '@Localizer["About Title"]';
                </script> 
              }
              و در آخر به صورت زیر در هر قسمتی قابل استفاده خواهند بود:
              <script type="text/javascript">
                 alert(resourceProvider.message1); 
              </script>
              نظرات مطالب
              ارتقاء به ASP.NET Core 1.0 - قسمت 17 - بررسی فریم ورک Logging
              یک نکته‌ی تکمیلی: روش فعالسازی ثبت لاگ‌ها در Windows EventLog 

              اگر از سرور ویندوزی استفاده می‌کنید، ثبت لاگ‌های برنامه در Windows EventLog و مشاهده‌ی آن‌ها توسط Event viewer ویندوز، یکی از روش‌های مناسب بررسی مشکلات برنامه پس از publish آن است. برای کار با آن، ابتدا نیاز است Windows Compatibility Pack for .NET Core را نصب کنید:
              > dotnet add package Microsoft.Windows.Compatibility --version 2.0.0-preview1-25914-04
              همچنین بسته‌ی نیوگت Microsoft.Extensions.Logging.EventLog نیز باید نصب شود (اگر از بسته‌ی Microsoft.AspNetCore.All استفاده می‌کنید، هم اکنون قابل دسترسی است).
              پس از آن فعالسازی ثبت در EventLog ویندوز به صورت ذیل است:
              var webHost = new WebHostBuilder()
                              //...
                              .ConfigureLogging((hostingContext, logging) =>
                              {
                                logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
                                logging.AddEventLog();
                              })
                              //...