۱ سال و ۵ ماه قبل، دوشنبه ۲۹ اسفند ۱۴۰۱، ساعت ۰۰:۵۹
۲ سال و ۳ ماه قبل، شنبه ۲۴ اردیبهشت ۱۴۰۱، ساعت ۱۶:۴۵
یا باید API جدیدی را ارائه بدهند و یا روش «تبدیل روشهای قدیمی کدنویسی غیرهمزمان به async سی شارپ 5» در صورت امکان استفاده شود. راه حل «async واقعی» دیگری ندارد؛ مگر اینکه یک Task.Run را خودتان به آن اضافه کنید تا بر روی یک ترد دیگر اجرا شود تا UI هنگ نکند؛ مانند مثالهای async غیرواقعی زده شده.
۲ سال و ۳ ماه قبل، شنبه ۲۴ اردیبهشت ۱۴۰۱، ساعت ۱۵:۱۱
برای کار با دستگاه هایی که اتصالها بر پایه IntropCom هست به چه شکلی میتوان فرایند async را انجام داد؟ مثلا دستگاهی که نیاز به انجام کانکت و سایر دستور العملها دارد که همین کانکت کردن مدت زمانی طول میکشد مانند متد زیر
device.connect(ip,port)
با توجه به اینکه دستور العمل در خارج از مرزهای اپلیکیشن انجام میگیرد امکان ایجاد یک متد غیرهمزمان وجود دارد؟
۵ سال و ۳ ماه قبل، دوشنبه ۲۰ خرداد ۱۳۹۸، ساعت ۰۴:۵۰
حذف شدی از سایت. بعد از این همه توضیح؟ .. مغرضی.
۵ سال و ۳ ماه قبل، دوشنبه ۲۰ خرداد ۱۳۹۸، ساعت ۰۴:۲۴
ایا روشی برای تست تقلبی بودن و یا تقلبی نبودن متدهای async وجود دارد ؟
یا به عبارتی چطور متوجه شویم متدی که ساختیم تا از جایی گرفتیم ( مثلا از stackowerflow برداشتیم) یه متد async واقعی است یا نه ؟
ممنونم .
۵ سال و ۳ ماه قبل، دوشنبه ۲۰ خرداد ۱۳۹۸، ساعت ۰۳:۱۳
مطلب تکمیلی دوم ،
ویدیو فارسی بسیار مفید در رابطه با مباحث TPL ( نخها ، استخر نخها ، چند نخی ، موازی ، متقارن ، نامتقارن و.... )
۵ سال و ۳ ماه قبل، پنجشنبه ۱۶ خرداد ۱۳۹۸، ساعت ۱۶:۵۴
«...در این تست متد async هر بار زمان بیشتری برای محاسبه برد (که خوب چون ترد جدید باز میکنه طبیعی هست)...»
- زمان بیشتر بردن کاملا طبیعی هست؛ چون متد async یک Coroutines را در پشت صحنه ایجاد میکند (کدهای قسمتی از آن توسط کامپایلر به این صورت تولید میشود):
و این Coroutines نسبت به حالت sync، تعداد سیکل CPU بیشتری را مصرف میکنند. اما نکتهی اصلی این است که عملیات async ترد جدیدی هم ایجاد نمیکند (دلیل اصلی علاقهی به آن این است و نه اینکه تعداد سیکل CPU کمتری دارد). بحث اصلی ما بالا رفتن میزان «مقیاسپذیری» سیستم هست و نه بالا رفتن سرعت اجرای قطعه کدی خاص که مطلقا چنین چیزی نیست.
+ متد WriteAsync برای نوشتن در FileStream (در استریم فایل سیستم) و یا نوشتن در استریم یک سوکت شبکه هست (IO-bound operations) و نه نوشتن در حافظه (MemoryStream) به صورت async که حاصلی ندارد (خلاصهی بحث جاری یا انجام عملیاتی CPU-bound operation). اهمیت نوشتن async در فایل سیستم و یا استریم سوکت شبکه هم در همان مطلب «اعمال غیر همزمان و چند ریسمانی» بحث شده و همچنین سایر قسمتهای این سری. بحث متدهای Async اضافه شده به دات نت فریم ورک، ربطی به مباحث چند ریسمانی ندارد «... متدهای Async واقعی کار با شبکه و اعمال I/O، از ترد استفاده نمیکنند ...». به همین جهت نسبت به حالت استفاده از تردها سربار کمتری دارند.
۵ سال و ۳ ماه قبل، پنجشنبه ۱۶ خرداد ۱۳۹۸، ساعت ۱۶:۰۰
متشکرم جناب مهندس ، من کل مطالب فارسی راجب به ترد و اسینک و ... چه در دات نت تیپز و چه در سایر وبسایتها و کورسها فارسی چنیدن بار مطالعه کردم ، باز خدا خیرش بده جناب نصیری حداقل در mvc توضیح دادن بقیه که فقط در سی شارپ گفتن و کاملا مشخصه خودشون دقیق نمیدونن چی هست ... اما مشکل من با عملی این موضوع هست نه تئوری ، و در پیاده سازی متاسفانه امکان تست صحت کارکرد وجود نداره (قطعا وجود داره ولی منابع نیست) در پایان لینکی که قرار داید ، یه مطلب انگلیسیه خوب ضمیمه شده ولی اون هم تئوری و کلی هست.
ایا ابزاری وجود داره که صحت درست کارکردن متدهای async رو بررسی کنه ؟
ایا مقاله یا ویدو اموزش دارید که به قول خود نویسندههای خارجی شیرجه بره در مفهوم async و الگریتم کار رو به چالش بکشه که مشخص کنه دقیقا پشت پرده چکار میکنه (واضح باشه) ؟
ممنونم.
۵ سال و ۳ ماه قبل، چهارشنبه ۱۵ خرداد ۱۳۹۸، ساعت ۲۳:۰۲
۵ سال و ۳ ماه قبل، چهارشنبه ۱۵ خرداد ۱۳۹۸، ساعت ۱۷:۲۳
در این مثال عملیات تبدیل sync به async درست انجام شده ؟
کد sync :
public string AESEncrypt(string Text) { byte[] dataToEncrypt = Encoding.UTF8.GetBytes(Text); byte[] key = Convert.FromBase64String(AES_Key); byte[] iv = Convert.FromBase64String(AES_Iv); using (var aes = new AesManaged()) { aes.Mode = CipherMode.CBC; aes.Padding = PaddingMode.PKCS7; aes.Key = key; aes.IV = iv; using (var ms = new MemoryStream()) { using (var cs = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write)) { cs.Write(dataToEncrypt, 0, dataToEncrypt.Length); cs.FlushFinalBlock(); return Convert.ToBase64String(ms.ToArray()); } } } }
public async Task<string> AESEncryptAsync(string Text) { byte[] dataToEncrypt = Encoding.UTF8.GetBytes(Text); byte[] key = Convert.FromBase64String(AES_Key); byte[] iv = Convert.FromBase64String(AES_Iv); using (var aes = new AesManaged()) { aes.Mode = CipherMode.CBC; aes.Padding = PaddingMode.PKCS7; aes.Key = key; aes.IV = iv; using (var ms = new MemoryStream()) { using (var cs = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write)) { await cs.WriteAsync(dataToEncrypt, 0, dataToEncrypt.Length); cs.FlushFinalBlock(); return Convert.ToBase64String(ms.ToArray()); } } } }
در این تست متد async هر بار زمان بیشتری برای محاسبه برد (که خوب چون ترد جدید باز میکنه طبیعی هست) و در تردها و هستههای مختلف cpu اجرا میشد ، که این هم طبیعی هست ، طرف نظر از این که طبق مقاله حاضر کلا اینجا async نباید اجرا بشه چون خارج از مرز سیستم نیست ولی عملیات async کامل انجام میشه (فکر میکنم).
اما متد sync که بررسی شد ، خروجی به صورتی بود که آن هم هر بار در ترد و هسته مختلف سی پی یو اجرا میشد ! سوال دلیل چیست ؟
مگر تفاوت sync و async دقیقا به اجرای آنها نیست ؟ پس چرا در هر دو حالت ما اجراهای یکسانی داریم ؟
ممنونم.