قانون دوم: Content
قانون سوم: Connection
قانون چهارم: Community
قانون پنجم: Commerce
قانون ششم: Communication
قانون هفتم: Customization
- دوشنبه ۳۰ بهمن ۰۲ ۲۳:۲۵ ۴ بازديد
- ۱ نظر
امروزه کمتر کسی هست که خطوط VOIP را نشیده باشد. با توجه به توسعه روز افزور شبکه و نیاز انتقال صدا در بستر شبکه این نیاز به VOIP روز به روز رو به افزایش است. بنابراین باید هر کس در حوزه IT حداقل دانش رو در این خصوص کسب کند و پیش نیاز های VOIP را خوب بشناسد. در این مقاله سعی کردم به صورت جامع مقدمات VOIP را ارائه کنم تا در کمترین زمان حداقل دانش مورد نیاز را خواننده کسب کند.
خوب ابتدا یک تعریفی از مرکز تلفن (سانترال،PBX،Call Center، Call Manager و ...) رو داشته باشیم.
مرکز تلفن : دستگاه یا سروری که می تواند ارتباط تلفنی یا ویدیویی را بین افراد برقرار کند. خوب به زبان ساده تر دستگاه یا سروری که تماس های داخلی شرکت رو برقرار میکند رو میگن.
این نکته توجه کنید اگر جایی کلمه PBX (Private Branch Exchange) رو دید منظور همون مرکز تلفن هست که جلوتر باهاش آشنا خواهیم شد.
یکی از اصلی ترین سوالات مهم چرا مراکز تلفن در شرکت ها راه اندازی میشود؟
مزایا راه اندازی مرکز تلفن : خوب مزایایی مرکز تلفن انقدر زیاده فقط خودش به تنهایی یک مقاله میشه بنابراین به چند مزیت برتر اشاره میکنیم.
مراکز تلفن PBX هارو اگه بخوایم دسته بندی کلی این مراکز رو بگیم می توانیم به چهار دسته بندی اصلی تقسیم کنیم:
البته در اینجا ما قصد معرفی مراکز تلفن نداریم جهت آشنایت به عنوان مثال مرکز تلفن پاناسونیک 824 یک مرکز تلفن آنالوگ و دیجیتال است که از این خطوط پشتیانی می کند.
یکی دیگر از مراکز تلفن معروف که در دسته بندی مرکز تلفن هایبرید می تواند قرار بگیرد مدل پاناسونیک TDE این شرکت است که از تمای خطوط آنالوگ ، دیجیتال و IP پشتیبانی میکند. مراکز تلفن سری NS500 این شرکت تحت شبکه می باشند.
شرکت پاناسونیک یکی از تولید کنندگان اصلی مراکز تلفن می باشد که در ایران هم در بسیاری شرکت ها دستگاه های آن در حال استفاده است که امنیت و پایداری بالایی دارند. مراکز تلفن پاناسونیک از نظر ظرفیت می توان به دو دسته تقسیم کرد:
از نظر اقتصادی مراکز تلفن را می توان به دو دسته کلی تقسیم کرد :
تفاوت های اصلی voip با خطوط انالوگ رو به صورت کلی بیان میکنیم:
با یک نگاه سطحی به تفاوت آنالوگ و voip می توان گفت رقابت آینده خطوط تلفن از آن خطوط voip خواهد بود.
بنابراین پیشنهادم اینه در شرکت جدیدی خواستین خطوط تلفن راه اندازی کنید حتما Voip رو انتخاب کنید.
VOIP مخفف Voice Over Internet Protocol است، یعنی ارسال صدا بر روی بستر IP.
تاریخچه voip ارتباط تنگاتنگی با تاریخچه اینترنت دارد که یکی از موضوعات شرکت ARPANET در سال 1960 بوده است. اولین تماس توسط VOIPNVP در سال 1973 در بستر IP برقرار شد.
نحوه کار این تکنولوژی بدون صورت است که ابتدا صدا را دریافت می کند و با استفاده از کدک(فشرده سازی) می کند و تبدیل به دیتا میکند و در بستر شبکه ارسال میکند و مقصد همین فرایند را برعکس انجام می دهد.
از اونجایی که هر کجا اسم ارتباط شبکه ای میاد اسم شرکت سیسکو در میون هست این شرکت در بحث VOIP در سال 2000 اولین شرکت تولید کننده تجهیزات VOIP محصوب می شود و امروزه هم تجهیزات بسیار باکیفیت ، پایداری و امنیت بالایی رو تولید می کند.
استریسک ASTERISK :
یک نرم افزار متن باز که در سالم 1999 توسط مارک اسپنسر که مشغول کار در شرکت دیجیوم بوده است طراحی و تولید شده است.
استریسک به عنوان یک مرکز تلفن قدرتمند Open Source در جهان محصوب می شود و کاربران زیادی را جهت کار توانسته است به خودش جذب کند.
در اصل استریسک را می توان یک هسته اصلی برای مراکز تلفن VOIP شناخت که پلتفرم های مختلفی که جلوتر با آن ها آشنا خواهیم شد برای این هسته ساخته شد.
این نرم افزار هم مانند استریسک یک هسته رایگان برای مراکز VOIP هست.ویژگی منحصر به فرد این نرم افزار هماهنگی کامل با بیشتر زبان های برنامه نویسی را دارد و می توان قدرتمند ترین هسته مراکز VOIP حساب کرد.
2 هسته اصلی مراکز VOIP برای اجرا نیاز به یک سیستم عام دارند که به صورت پیش فرض بر روی Linux پیاده می شوند اما می توان بر روی سیستم عاملی های دیگر مانند FreeBSD , ... هم پیاده نمائید.
یک پلتفرم متن باز می باشد که برای مدیریت راحت تر گرافیکی استریسک طراحی و پیاده شده است. این رابط گرافیکی در سال 2004 طراحی شده است و در سال 2006 به ثبت رسید و در سال 2015 شرکت سنگوما اصلی ترین اسپانسر مالی این شرکت شد .این پلتفرم یکی از محبوب ترین پلتفرم های دنیا جهت کار با استریسک می باشد که بیش از 2 میلیون نسخه فعال در 225 کشور جهان دارد .شرکت سنگوما شروع به ساخت مراکز تلفن سخت افزاری سنگوما کرد که هسته نرم افزاری این سخت افزار از FreePBX با ظرفیت ها مختلف کرده است که پشتیبانی کارشناسان شنگوما را نیز دارد.
محبوب ترین پلتفرم متن باز و تا حدودی رایگان در ایران هست و یک رابط گرافیکی خوب برای کار با استریسک رو طراحی و پیاده کرده است.ایزابل گرفته شده از Elastisx است که بعد از متوقف شدن توسعه این نرافزار در سال 2016 ، این پلفرم با نام ایزابل توسعه داده شد.ایزابل تحت مجوز GPL می باشد.
در شبکه های voip پروتکل های مختلفی در حال استفاده می شود که نیازمند آشنایی اولیه با این چهار پروتکل مهم این شبکه آشنایی پیداکنید.
SIP مخفف Session Initiation Protocol است.این پروتکل شروع کارش در سال 1996 بوده است که در سال 1999 بازنگری در این پروتکل انجام شده است.در زمان ابتدا SIP استفاده چندانی در شبکه voip نداشت اما پس از گسترش این شبکه و مزایایی که این پروتکل ارائه داد محبوب ترین پروتکل مورد استفاده در voip محسوب می شود. این پروتکل در ارتباط بین مراکز تلفن و ارتباط تلفن رومیزی با مرکز تلفن مورد استفاده قرار میگیرد.
پروتکل SIP از پروت 5060 / TCP-UTP به صورت پیش فرض استفاده می کند و جهت احراز هویت از روش MD5 استفاده می کند. در بحث امنیت این پروتکل بیشتر حمله در این پروتکل DOS است .
این پروتکل جهت تکمیل فرایند ارتباطی از دو پروتکل RTP و SDP به صورت مکمل استفاده می کند.
این پروتکل در اوایل ایجاد شبکه voip جهت انتقال صدا مورد استفاده قرار میگرد که امروز کمتر استفاده می شود.محبوب ترین پروتکل مورد استفاده sip و iax در استفاده می شود.این پروتکل مانند پروتکل sip از پروتکل RTP برای تکمیل فرایند انتقال صدا در خود استفاده می کند.
IAX مخفف Inter-Asterisk Exchange است.این پروتکل هم یکی از محبوب ترین پروتکل ها هسته استریسک است که سازنده این پروتکل تیم توسعه استریسک است که جهت برطرف کردن چندین نقطه ضعف sip طراحی و مورد استفاده قرار گرفت که در حال توسعه و رقابت با sip می باشد.جدید ترین ورژن IAX2 نیز ارائه شده است. IAX برای انتقال صدا از باینتری 0 و 1 استفاده می کند در حالی که sip از Plain Text استفاده می کند که این کار باعث هماهنگی بیشتر با کدک ها و پهنای باند کمتری استفاده می شود. یکی از مشکلات اصلی این پروتکل در برقرای اولیه ارتباط عمل handshaking را انجام نمی دهد که میتوان حملات DOS روی این پروتکل اجرا شود و سریع از دسترس خارج شود.
این پروتکل جهت انتقال صدا می باشد که در لایه 4 پروتکل OSI استفاده می شود. همانطوری که در قسمت بالا گفتیم این پروتکل مکمل دیگر پروتکل ها می باشد و درست پس از برقرای ارتباط شبکه استفاده می شوند. وظیفه این پروتکل جمع آوری اطلاعات که بین مبدا و مقصد می باشد که جهت آنالیز و ... مورد استفاده قرار میگیرد.
RTP سه پارامتر مهم دارد time stamp - squeis number - poulood type که عمل بافر کردن -شماره گذاری پکت ها - نوع rtp استفاده می شود. پروتکل RTP یک پروتکل یک طرفه می باشد .
یک مسئله اصلی در شبکه همیشه پهنای باند می باشد که این مسئله نیز در voip بسیار مهم بوده است که پهنای باند استفاده شده چه مقدار باشد.
Codec مخفف coder-decoder است. کدک جهت تبدیل انالوگ به دیجیتال و فشرده سازی صدا در بستر شبکه را می باشد.این عمل در لایه 6 مدل OSI انجام می شود.
یک کدک اصلی در PSTN (آنالوگ) می باشد که عمل فشرده سازی انجام نمی شود. بنابراین نیازمند پردازش زیادی برای انتقال صدا انجام نمی شود و پهنای باند زیادی نیاز می باشد برای این مدل کدک .
این کدک در استریسک استفاده می شود و عمل فشرده سازی و تبدیل انجام می شود. کیفیت صدای دریافتی در این کدک کیفیت خوب مانند G.711 دارد اما پهنای باند نصب کدک G.711 را اشغال می کند بنا براین نیازمند مقداری پردازش زیادی می باشد.
این کدک هم در استریسک استفاده می شود و عمل فشرده سازی بیشتری انجام می شود کیفیت صدا پایین تر از مدل G.711 به ما می دهد و پردازش بیشتری نسبت به کدک G.726 بر روی این بسته ها انجام می شود و پهنای باند بسیار کمی استفاده می کند.
کدک محبوب مورد استفاده در استریسک می باشد که عملکرد فوق العاده ای رو در تبدیل و فشرده سازی انجام می دهد.
اصول عملکرد مراکز تلفن جهت استفاده در سازمان نیازمند یک حداقل سرویس ها می باشد که به صورت کلی می توان به دو تنظیم اصلی و چند تنظیم دیگر جهت دریافت خدمات بیشتر مراکز تلفن استفاده می شود.
پس از دو تنظیم اولیه ذکر شده به صورت کلی می توان داخلی های سازمانی را راه اندازی کنیم .
یکی از موارد اصول عملکرد دیگر مراکز تلفن تعیین مسیر تماس ها می باشد که به دو دسته می توان تقسیم کرد:
راه اندازی سرویس های مورد نیاز بیشتر برای مدیریت بهتر مراکز تلفن می باشد.
راه اندازی VOIP نیازمند یک سری تجهیزات می باشد که به صورت کلی ما آن را به پنج دسته تقسیم کرده ایم :
سرور های VIOP را می توان به دو دسته بندی کلی تقسیم کرد.
تلفن های VOIP را نیز می توان به دو دسته بندی کلی تقسیم کرد.
گیت وی ها از نظر کارایی می توان به دو دسته بندی کلی تقسیم کرد.
از این دو دستگاه همزمان نیز برای انتقال یک خط آنالوگ از نقطه A به نقطه B در بستر شبکه استفاده کرد.
اخرین و مهمترین نیازمندی راه اندازی VOIP ، داشتن یک نیروی متخصص VOIP می باشد.
شما با گذراندن این دوره آموزشی ویپ ( VoIP ) به لحاظ علمی و کیفی می توانید پروژه های VoIP شرکت های کوچک و بزرگ را انجام میدهید.
همچنین دوره آموزش نتورک پلاس (Network+) ( آموزش صفر تا صد Network+ ) شرکت کامپتیا که در آن تمامی مفاهیم برای یادگیری عمیق و بهتر طبق آخرین سرفصل های بین المللی آموزش شبکه و بر اساس آزمون بین المللی CompTIA Network+ N10-008 طراحی و تدوین شده است. شرکت کرده تا مفاهیم رو راحتر درک کنید.
حرفه Prompt Engineering یکی از مهارتهای کلیدی برای بهرهبرداری از قدرت مدلهای زبانی Generative یا ژنراتیو است. این مدلها با استفاده از شبکههای عصبی عمیق و روشهای یادگیری ماشینی قادر هستند به صورت خودکار متنهای متنوع و معنادار تولید کنند. اما چطور میشه با این مدلها ارتباط برقرار کرد و ازشون خروجیهای مورد نظرمون رو گرفت؟ جواب این سوال در Prompt Engineering نهفته است.
به طور کلی Prompt Engineering هنر پرسیدن سوال مناسب برای گرفتن بهترین خروجی از یک مدل زبانی ژنراتیو است. با استفاده از Prompt Engineering میتونیم با استفاده از زبان طبیعی با مدلهای زبانی ارتباط برقرار کنیم و ازشون خروجیهای متنی یا تصویری بگیریم. این خروجیها میتونن در حوزههای مختلفی مثل تولید محتوا، ترجمه، خلاصهسازی، تحلیل احساسات، تشخیص تصاویر، و غیره کاربرد داشته باشند.
در این مقاله قصد داریم به شما نشان بدیم که چطور میتونید Prompt Engineering رو به عنوان یک ابزار قدرتمند برای استفاده از مدلهای زبانی ژنراتیو به کار بگیرید. ما انواع مختلف Prompt رو معرفی میکنیم و نحوهی استفاده از هر کدوم رو با مثال نشون میدیم. همچنین بهترین شیوهها و راهبردهای Prompt Engineering رو با شما در میان میگذاریم و به چالشها و فرصتهایی که در این زمینه وجود داره اشاره میکنیم. امیدواریم این مقاله برای شما مفید و جذاب باشه.
مفهوم Prompt یک سوال یا یک درخواست است که به یک مدل زبانی ژنراتیو داده میشود تا از آن یک خروجی متنی یا تصویری بسازد. انواع مختلفی از Prompt وجود دارند که بسته به نوع و هدف مدل و خروجی مورد نظر میتوان از آنها استفاده کرد. در این بخش به معرفی چهار نوع اصلی از Prompt میپردازیم:
Direct Prompting: این نوع از Prompt سادهترین و مستقیمترین روش برای ارتباط با مدلهای زبانی است. در این روش، فقط یک سوال یا یک جمله به مدل داده میشود و مدل سعی میکند به آن پاسخ دهد یا آن را تکمیل کند. مثلا میتوان از مدل خواست که یک جمله را با یک کلمه تمام کند یا یک تعریف را بیان کند. مثال:
تکمیل جمله: ایران یک کشور در قاره ... است.
تعریف: Prompt Engineering چیست؟
Prompting with Examples: این نوع از Prompt شبیه به آموزش مدل با مثال است. در این روش، چند مثال از ورودی و خروجی مورد نظر به مدل داده میشود و سپس یک ورودی جدید به مدل داده میشود تا خروجی متناسب با آن را تولید کند. این روش میتواند برای انجام کارهایی مثل ترجمه، خلاصهسازی، تبدیل سبک، و غیره مفید باشد. مثال:
ترجمه:
انگلیسی: Hello, how are you؟
فارسی: سلام، حال شما چطور است؟
انگلیسی: I am fine, thank you.
فارسی: من خوبم، ممنون.
انگلیسی: What is your name؟
Chain-of-Thought Prompting: این نوع از Prompt برای تولید متنهای طولانی و پیوسته مثل داستان، مقاله، شعر، و غیره مناسب است. در این روش، به مدل یک موضوع یا یک شروع داده میشود و مدل باید متن را با ادامهدادن افکار و ایدههای مرتبط با آن تولید کند. مثال:
داستان: شروع داستان: یک روز صبح، مهدی با صدای زنگ گوشیش بیدار شد. وقتی گوشی را برداشت، صدایی که شنید، او را شوکه کرد. صدای ...
مقاله: موضوع مقاله: اثرات مثبت Prompt Engineering بر روی یادگیری ماشینی. مقاله باید شامل مقدمه، بدنه، و نتیجهگیری باشد. مقدمه: در سالهای اخیر، مدلهای زبانی ژنراتیو با استفاده از شبکههای عصبی عمیق و روشهای یادگیری ماشینی قدرتمند شدهاند و میتوانند متنهای متنوع و معنادار تولید کنند. اما چطور میتوان از این مدلها به بهترین نحو استفاده کرد و خروجیهای مورد نظر را از آنها گرفت؟ در این مقاله قصد داریم نشان بدهیم که Prompt Engineering یکی از راههای موثر برای ارتباط با مدلهای زبانی است و چگونه میتوان با استفاده از آن یادگیری ماشینی را بهبود بخشید. ...
Role Prompting: این نوع از Prompt برای ایجاد محاوره و گفتگو با مدل مناسب است. در این روش، به مدل یک نقش یا یک شخصیت داده میشود و مدل باید با توجه به آن نقش یا شخصیت به سوالات و پیامهای کاربر پاسخ دهد. مثال:
نقش: یک مشاور تحصیلی
کاربر: سلام، من میخوام برای ادامهی تحصیل به خارج از کشور برم. چه کشورها و دانشگاههایی رو پیشنهاد میکنید؟
مدل: سلام، من یک مشاور تحصیلی هستم و میتونم کمکت کنم. برای انتخاب کشور و دانشگاه باید چند عامل رو در نظر بگیری مثل رشتهی تحصیلی، هزینهها، شرایط ویزا، فرهنگ و زبان، و غیره. بهتره اول از خودت بپرسی که چه چیزهایی برای تو مهم هستند و بر اساس اون یک لیست از کشورها و دانشگاههای مورد علاقهات بسازی. بعد میتونی از منتورها، استادها، دوستان، یا سایتهای معتبر اطلاعات بیشتری در مورد اونها بگیری و مقایسه کنی. اگر نیاز به راهنمایی بیشتر داشتی، من در خدمتم.
Prompt Engineering یک فن هنری است که نیاز به تمرین و تجربه دارد. هرچه بیشتر با مدلهای زبانی کار کنیم و Prompt های مختلف رو امتحان کنیم، مهارتمون در این زمینه بیشتر میشه. اما برای نوشتن Prompt های موثر و کارآمد، برخی از نکات و توصیههایی وجود داره که میتونه به ما کمک کنه. در این بخش به برخی از این نکات اشاره میکنیم:
ساختارمند بودن: یکی از راههایی که میتونه به مدل کمک کنه تا Prompt رو بهتر درک کنه و خروجی مناسبتری تولید کنه، اینه که Prompt رو به صورت ساختارمند و قابل فهم بنویسیم. مثلا میتونیم از علائم نگارشی مثل نقطه، ویرگول، دونقطه، پرانتز، و غیره استفاده کنیم تا جملات و بخشهای مختلف Prompt رو از هم جدا کنیم. همچنین میتونیم از عنوانها، شمارهگذاری، و لیستها استفاده کنیم تا Prompt رو به بخشهای کوچکتر و مرتبتر تقسیم کنیم. این کار باعث میشه مدل بتونه Prompt رو بهتر تحلیل کنه و خروجی رو با توجه به ساختار Prompt تنظیم کنه.
محدود بودن: یکی از چالشهایی که مدلهای زبانی با آن روبرو هستند، اینه که ممکنه خروجیهایی تولید کنند که با Prompt مطابقت ندارند یا از حدود مورد نظر خارج میشوند. برای جلوگیری از این مشکل، میتونیم از محدودیتهایی استفاده کنیم تا مدل رو راهنمایی کنیم که چه نوع و چه مقدار خروجی باید تولید کنه. مثلا میتونیم از عباراتی مثل «با حداکثر ۵۰۰ کلمه» یا «به صورت شعر» یا «با استفاده از فقط حروف الفبای فارسی» استفاده کنیم تا مدل رو محدود کنیم. مثال:
Prompt با محدودیت: تولید یک داستان کوتاه در مورد یک سفر فضایی با حداکثر ۵۰۰ کلمه.
Prompt بدون محدودیت: تولید یک داستان در مورد یک سفر فضایی.
خلاقانه بودن: یکی از راههایی که میتونه به مدل کمک کنه تا Prompt رو بهتر فهمیده و خروجی جذابتری تولید کنه، اینه که Prompt رو به صورت خلاقانه و جالب بنویسیم. مثلا میتونیم از سوالات باز، مقایسهها، تصاویر، مثالها، و غیره استفاده کنیم تا مدل رو به چالش بکشیم و ازش خروجیهایی بگیریم که از حد انتظارمون بیشتر باشه. مثال:
Prompt خلاقانه: تولید یک شعر در مورد این تصویر (بارگذاری تصویر برای مدل زبانی)
Prompt عادی: تولید یک شعر در مورد غروب خورشید.
Prompt Engineering یکی از مهارتهای کلیدی برای بهرهبرداری از قدرت مدلهای زبانی ژنراتیو است. در این مقاله با انواع مختلف Prompt آشنا شدیم و نحوهی استفاده از هر کدوم رو با مثال نشون دادیم. همچنین به برخی از بهترین شیوهها و راهبردهای Prompt Engineering اشاره کردیم و چند نکته برای نوشتن Promptهای ساختارمند، محدود، و خلاقانه رو با شما در میان گذاشتیم. امیدواریم این مقاله برای شما مفید و جذاب بوده باشه و بتونید از Prompt Engineering به عنوان یک ابزار قدرتمند برای استفاده از مدلهای زبانی به کار ببرید.
همچنین Prompt Engineering یک زمینهی پویا و در حال رشد است که همچنان چالشها و فرصتهای زیادی در پیش روی آن است. ما توصیه میکنیم که برای ارتقای مهارتتون در این زمینه، با مدلهای زبانی مختلف آزمایش کنید و Promptهای متنوع و جالب رو امتحان کنید. همچنین میتونید از منابع و مقالات معتبر و بهروز در این زمینه استفاده کنید و از تجربیات و نظرات دیگران بهره ببرید. ما امیدواریم که Prompt Engineering برای شما یک فن هنری و لذتبخش باشه و به شما کمک کنه تا از مدلهای زبانی بهترین نتایج رو بگیرید.
برای درک مفاهیم بیشتر و یادگیری عمیق به دوره آموزشی سی شارپ که دارای سرفصل های اصلی دوره مقدماتی سی شارپ و دوره پیشرفته سی شارپ را که در قالب یک مجموعه جامع ارائه شده اند مراجعه کنید. در کنار این دوره می توانید برای تقویت دانش بانک اطلاعاتی ، به دوره آموزش SQL Server نیز مراجعه کنید.
برنامهنویسی غیرهمزمان یکی از مفاهیم مهم و پرکاربرد در توسعه نرمافزار است. برنامهنویسی غیرهمزمان به معنای این است که برنامه میتواند بدون انتظار برای پایان یافتن یک عملیات، به اجرای عملیات دیگر ادامه دهد. این روش به برنامه امکان میدهد که به صورت همزمان چندین کار را انجام دهد و منابع سیستم را بهینهتر استفاده کند. برنامهنویسی غیرهمزمان به ویژه در مواردی که برنامه باید با منابع خارجی مانند فایل، شبکه، دیتابیس و غیره ارتباط برقرار کند، بسیار مفید است. زیرا در این موارد برنامه ممکن است برای دریافت پاسخ از منبع خارجی مدت زمان زیادی صرف کند و در این حالت اگر برنامه به صورت همزمان اجرا شود، میتواند منابع سیستم را برای انجام کارهای دیگر استفاده کند و به کاربر تجربه بهتری ارائه دهد.
برای پیادهسازی برنامهنویسی غیرهمزمان در زبان C#، دو روش اصلی وجود دارد: استفاده از Thread ها و استفاده از کلمات کلیدی Async و Await. بو صورت ساده، Thread ها واحدهای کوچک از کد هستند که میتوانند به صورت موازی و مستقل از هم اجرا شوند. در مقابل، Async و Await کلمات کلیدی هستند که به برنامهنویس امکان میدهند که به راحتی برنامهنویسی غیرهمزمان را با استفاده از Task ها پیادهسازی کند. Task ها شبیه به Thread ها هستند اما با این تفاوت که مدیریت و هماهنگی آنها توسط کتابخانههای زبان C# انجام میشود.
در این مقاله قصد داریم تفاوت این دو روش را بررسی کنیم و نشان دهیم که در چه مواردی از هر یک از آنها استفاده کنیم. برای این منظور ابتدا تعریف و ویژگیهای Thread ها و Async و Await را شرح میدهیم و سپس نقاط تمایز اصلی بین آنها را مورد بحث قرار میدهیم. در نهایت نتیجهگیری و توصیههایی برای انتخاب روش مناسب برای برنامهنویسی غیرهمزمان ارائه میکنیم.
Thread ها یا ریسمانها واحدهای کوچک از کد هستند که میتوانند به صورت موازی و مستقل از هم اجرا شوند. Thread ها به برنامه امکان میدهند که چندین کار را به صورت همزمان انجام دهد و منابع سیستم را بهتر استفاده کند. برای مثال، اگر برنامهای داریم که باید همزمان با کاربر ارتباط برقرار کند و محتویات یک فایل را بخواند، میتوانیم از دو Thread مجزا برای انجام این دو کار استفاده کنیم. در این صورت برنامه نیازی ندارد که برای خواندن فایل از کاربر منتظر بماند و یا برای پاسخ به کاربر از خواندن فایل صرف نظر کند.
برای استفاده از Thread ها در زبان C#، میتوانیم از کلاسها و روشهای موجود در فضای نام System.Threading استفاده کنیم. این فضای نام شامل کلاس Thread است که نماینده یک Thread در برنامه است. برای ایجاد یک Thread جدید، میتوانیم یک شیء از کلاس Thread با پاس دادن یک شیء از نوع Delegate به سازنده آن ایجاد کنیم. Delegate یک شیء است که به یک متد اشاره میکند و مشخص میکند که Thread باید چه متدی را اجرا کند. برای شروع اجرای Thread، میتوانیم از متد Start شیء Thread استفاده کنیم. برای متوقف کردن اجرای Thread، میتوانیم از متد Abort شیء Thread استفاده کنیم. همچنین جهت انتظار برای پایان یافتن یک Thread، میتوانیم از متد Join شیء Thread استفاده کنیم. برای مثال، کد زیر یک Thread جدید ایجاد میکند که متد PrintNumbers را اجرا میکند:
using System;
using System.Threading;
class Program
{
static void Main(string[] args)
{
Thread t = new Thread(new ThreadStart(PrintNumbers));
t.Start();
t.Join();
Console.WriteLine("End of application.");
}
static void PrintNumbers()
{
for (int i = 1; i <= 10; i++)
{
Console.WriteLine(i);
}
}
}
خروجی این برنامه به شکل زیر است:
1
2
3
4
5
6
7
8
9
10
End of application!
استفاده از Thread ها مزایایی مانند افزایش کارایی و بهبود تجربه کاربر را دارد. اما همچنین چالشهایی مانند مدیریت و هماهنگی Thread ها، رفع خطاها و ایجاد امنیت را نیز به همراه دارد. برای حل این چالشها، میتوانیم از ابزارهایی مانند Lock، Monitor، Mutex، Semaphore، AutoResetEvent و ManualResetEvent استفاده کنیم. این ابزارها به ما کمک میکنند که دسترسی به منابع مشترک بین Thread ها را کنترل کنیم و از بروز تداخل و ناهماهنگی جلوگیری کنیم. در بخش بعدی، میتوانید با کلمات کلیدی Async و Await و نحوه استفاده از آنها برای برنامهنویسی غیرهمزمان آشنا شوید.
Async و Await کلمات کلیدی هستند که در زبان C# از نسخه 5 به بعد اضافه شدهاند. این کلمات کلیدی به برنامهنویس امکان میدهند که به راحتی برنامهنویسی غیرهمزمان را با استفاده از Task ها پیادهسازی کند. Task ها شبیه به Thread ها هستند اما با این تفاوت که مدیریت و هماهنگی آنها توسط کتابخانههای زبان C# انجام میشود. Task ها به ما امکان میدهند که یک عملیات غیرهمزمان را به صورت یک شیء مدیریت کنیم و بتوانیم به آن ارجاع دهیم، از وضعیت آن باخبر شویم و از آن نتیجه بگیریم.
برای استفاده از Async و Await در زبان C#، میتوانیم از کلاسها و روشهای موجود در فضای نام System.Threading.Tasks استفاده کنیم. این فضای نام شامل کلاس Task است که نماینده یک Task در برنامه است. برای ایجاد یک Task جدید، میتوانیم از متد Run شیء Task استفاده کنیم. این متد یک شیء از نوع Delegate میگیرد و یک شیء از نوع Task برمیگرداند. برای اجرای یک Task، میتوانیم از کلمه کلیدی Async در تعریف یک متد استفاده کنیم. این کلمه کلیدی به ما امکان میدهد که یک متد را به صورت غیرهمزمان تعریف کنیم و از کلمه کلیدی Await در بدنه آن استفاده کنیم. کلمه کلیدی Await به ما امکان میدهد که برای یک Task منتظر بمانیم و نتیجه آن را دریافت کنیم. برای مثال، کد زیر یک Task جدید ایجاد میکند که متد PrintNumbersAsync را اجرا میکند:
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
// ایجاد یک Task جدید با استفاده از متد Run
Task t = Task.Run(PrintNumbersAsync);
await t;
Console.WriteLine("End of application!");
}
static async Task PrintNumbersAsync()
{
for (int i = 1; i <= 10; i++)
{
Console.WriteLine(i);
// انتظار برای یک ثانیه
await Task.Delay(1000);
}
}
}
خروجی این برنامه به شکل زیر است:
1
2
3
4
5
6
7
8
9
10
End of application!
استفاده از Async و Await مزایایی مانند سادهسازی برنامهنویسی غیرهمزمان، افزایش خوانایی و نگهداری کد و بهبود عملکرد برنامه را دارد. اما همچنین مواردی وجود دارد که استفاده از Async و Await کافی نیست و نیاز به استفاده از Thread ها داریم. برای مثال، اگر برنامهای داریم که باید یک عملیات سنگین و محاسباتی را انجام دهد که زمان زیادی طول میکشد و منابع سیستم را به شدت مصرف میکند، میتوانیم از یک Thread جدید برای انجام این عملیات استفاده کنیم تا از بلوک شدن Thread اصلی برنامه جلوگیری کنیم. در بخش بعدی، میتوانید با تفاوت اصلی بین Thread ها و Async و Await آشنا شوید.
Thread ها و Async/Await دو روش مختلف برای پیادهسازی برنامهنویسی غیرهمزمان در زبان C# هستند. این دو روش در برخی جنبهها شباهت و در برخی جنبهها تفاوت دارند. در این بخش قصد داریم نقاط تمایز اصلی بین این دو روش را مورد بحث قرار دهیم. برای این منظور از جدول زیر برای مقایسه این دو روش استفاده میکنیم:
Async/Await | Thread | |
نحوه ایجاد | با استفاده از کلاس Thread و پاس دادن یک Delegate به سازنده آن | با استفاده از کلمه کلیدی Async در تعریف یک متد و استفاده از متد Run شیء Task |
نحوه اجرا | با استفاده از متد Start شیء Thread | با استفاده از کلمه کلیدی Await در بدنه یک متد غیرهمزمان |
نحوه متوقف کردن | با استفاده از متد Abort شیء Thread | با استفاده از متد Cancel شیء CancellationTokenSource |
نحوه انتظار | با استفاده از متد Join شیء Thread | با استفاده از متد Join شیء Thread | با استفاده از کلمه کلیدی Await در بدنه یک متد غیرهمزمان |
نحوه دریافت نتیجه | با استفاده از خصوصیت Result شیء Thread | با استفاده از خصوصیت Result شیء Task |
مزایا | امکان اجرای عملیات سنگین و محاسباتی که زمان زیادی طول میکشند و منابع سیستم را به شدت مصرف میکنند | امکان اجرای عملیات سبک و وابسته به منابع خارجی مانند فایل، شبکه، دیتابیس و غیره که زمان زیادی طول میکشند اما منابع سیستم را به شدت مصرف نمیکنند |
معایب | امکان بروز تداخل و ناهماهنگی بین Thread ها و نیاز به استفاده از ابزارهای هماهنگسازی | امکان بلوک شدن Thread اصلی برنامه اگر عملیات سنگین و محاسباتی را به صورت غیرهمزمان اجرا کنیم |
از جدول بالا میتوانیم ببینیم که Thread ها و Async/Await در برخی جنبهها مانند نحوه ایجاد، اجرا، متوقف کردن، انتظار و دریافت نتیجه تفاوت دارند. این تفاوتها باعث میشوند که در چه مواردی از هر یک از این روشها استفاده کنیم. به طور کلی، میتوان گفت که اگر برنامهای داریم که باید یک عملیات سنگین و محاسباتی را انجام دهد که زمان زیادی طول میکشد و منابع سیستم را به شدت مصرف میکند، میتوانیم از یک Thread جدید برای انجام این عملیات استفاده کنیم تا از بلوک شدن Thread اصلی برنامه جلوگیری کنیم. اما اگر برنامهای داریم که باید یک عملیات سبک و وابسته به منابع خارجی مانند فایل، شبکه، دیتابیس و غیره را انجام دهد که زمان زیادی طول میکشد اما منابع سیستم را به شدت مصرف نمیکند، میتوانیم از کلمات کلیدی Async و Await برای انجام این عملیات استفاده کنیم تا از سادهسازی برنامهنویسی غیرهمزمان بهره ببریم.
در نتیجه، میتوان گفت که Thread ها و Async/Await دو روش مختلف برای پیادهسازی برنامهنویسی غیرهمزمان در زبان C# هستند که در برخی جنبهها شباهت و در برخی جنبهها تفاوت دارند. این تفاوتها باعث میشوند که در چه مواردی از هر یک از این روشها استفاده کنیم. در بخش بعدی، میتوانید با نتیجهگیری و توصیههایی برای انتخاب روش مناسب برای برنامهنویسی غیرهمزمان آشنا شوید.
در این مقاله با مفهوم برنامهنویسی غیرهمزمان و اهمیت آن در توسعه نرمافزار آشنا شدیم. همچنین با دو روش اصلی برای پیادهسازی برنامهنویسی غیرهمزمان در زبان C# یعنی استفاده از Thread ها و استفاده از کلمات کلیدی Async و Await آشنا شدیم. برای هر یک از این روشها تعریف، ویژگی، مزایا و معایب را شرح دادیم و سپس نقاط تمایز اصلی بین آنها را مورد بحث قرار دادیم. در نهایت به این نتیجه رسیدیم که این دو روش در برخی موارد با هم قابل جایگزینی هستند و در برخی موارد نیاز به استفاده از هر یک به طور مجزا دارند. برای انتخاب روش مناسب برای برنامهنویسی غیرهمزمان، باید به نوع عملیاتی که میخواهیم انجام دهیم، زمانی که آن عملیات طول میکشد، منابع سیستمی که آن عملیات مصرف میکند و همچنین سادگی و خوانایی کدی که مینویسیم توجه کنیم. به طور کلی، میتوان گفت که اگر برنامهای داریم که باید یک عملیات سنگین و محاسباتی را انجام دهد که زمان زیادی طول میکشد و منابع سیستم را به شدت مصرف میکند، میتوانیم از یک Thread جدید برای انجام این عملیات استفاده کنیم تا از بلوک شدن Thread اصلی برنامه جلوگیری کنیم. اما اگر برنامهای داریم که باید یک عملیات سبک و وابسته به منابع خارجی مانند فایل، شبکه، دیتابیس و غیره را انجام دهد که زمان زیادی طول میکشد اما منابع سیستم را به شدت مصرف نمیکند، میتوانیم از کلمات کلیدی Async و Await برای انجام این عملیات استفاده کنیم تا از سادهسازی برنامهنویسی غیرهمزمان بهره ببریم.
برای رفع مشکل Save As در فتوشاپ کافیست این مراحل را انجام دهید. اگر در گزینه Save As در فتوشاپ امکان ذخیره کردن عکس با فرمت JPEG یا JPG یا سایر فرمت ها وجود ندارد ، به احتمال زیاد شما فتوشاپ خود را به آخرین نسخه به روز رسانی کرده این و قابلیت Legacy Save As آن غیرفعال شده است ، در این حالت تنها چند گزینه برای ذخیره فایل به عنوان تصویر وجود دارد که بسیار محدود است ، برای حل این مشکل به مسیر زیر در فتوشاپ بروید :
مطابق تصویر بالا تیک گزینه Enable Legacy "Save As" را بزنید و OK کنید ، خروجی های Save AS قدیمی و JPG را مجدد می توانید ببینید. در دوره آموزش فتوشاپ توسینسو می توانید بصورت حرفه ای ترفندها و نکات مهم فتوشاپ را به خوبی آموزش ببینید.