
آموزش استریمینگ Streaming در دات نت
آموزش استریمینگ Streaming در دات نت یکی دیگر از آموزش های گروه آموزشی پرووید می باشد که در این قسمت آن را به شما معرفی می کنیم. این بسته ی آموزشی نیز یکی از دوره های آموزشی دیگر که در حوزه ی فارسی سازی آموزش های انگلیسی تنظیم شده است می باشد. عنوان این بسته ی آموزشی Streaming در دات نت 4.5 است که با نام اصلی Streaming in .NET 4.5 از شرکت Pluralsight منتشر شده است.
Stream چیست؟
کلاس Stream در دات نت یک کلاس پایه (Base Class) برای تمامی Stream های تعریف شده است. به زبان ساده Stream یک دنباله از بایت های اطلاعاتی (از قبیل فایل، دستگاه های ورودی و خروجی، pipe های ICP و یا سوکت های TCP/IP) هستند.
در فضای دات نت، سه نوع عملیات اساسی را می توان با Stream ها انجام داد:
- خواندن از Stream ها: خواندن به معنی انتقال بایت های داده ای از یک Stream به یک ساختمان داده شبیه یک آرایه است.
- نوشتن در Stream ها: نوشتن به معنی انتقال داده های درون یک ساختمان داده به یک Stream است.
- Seek کردن: Seek کردن در یک Stream به معنی تغییر داده ی فعلی در یک Stream است. Stream های مختلف ممکن است مکانیزم های مختلفی برای Seek کردن داشته باشند و یا از Seek کردن پشتیبانی نکنند. برای مثال Network Stream از عملیات Seeking به راحتی پشتیبانی نمی کند.
کاربرد Stream ها در برنامه نویسی چیست؟
Stream ها در دات نت به ما این امکان را می دهند که داده های حجیم را به صورت قسمت قسمت به برنامه وارد کنیم و از پر کردن حافظه ی سیستم از داده های حجیمی که از بانک های اطلاعاتی دریافت می شوند جلوگیری کنیم. استفاده کردن از Stream ها در برنامه ها اغلب امری اجتناب ناپذیر است.

موضوع مهم تر اینکه در فضای برنامه نویسی در دات نت، موضوعات بسیاری در رابطه با کار کردن با Stream ها وجود دارند که یک برنامه نویس باید از آنها اطلاع داشته باشد. ضمناً توصیه می کنیم که از آموزش کار با فایل ها و استریم Stream ها در سی شارپ نیز استفاده کنید.
معماری Stream در دات نت چگونه سازماندهی شده است؟
در دات نت، کلاس پایه Stream یک قرارداد مشترک برای کار با جریان داده فراهم میکند. به کمک این ساختار، کد برنامه میتواند بدون وابستگی کامل به نوع منبع داده، عملیاتهایی مانند خواندن و نوشتن را انجام دهد. برای مثال، یک بخش از برنامه ممکن است اطلاعات را از فایل بخواند و بخش دیگری همان منطق پردازش را با دادههای موجود در حافظه اجرا کند. استفاده از کلاس پایه مشترک باعث میشود بسیاری از عملیاتها با الگوی برنامهنویسی مشابهی انجام شوند.
کلاسهای مشتقشده از Stream رفتارهای متفاوتی را متناسب با منبع یا مقصد داده ارائه میکنند. برخی برای فایلها، برخی برای ارتباط شبکه و برخی دیگر برای نگهداری داده در حافظه طراحی شدهاند. همچنین بعضی Streamها میتوانند رفتارهای موجود را با قابلیتهای دیگری ترکیب کنند. شناخت این معماری به توسعهدهندگان کمک میکند هنگام انتخاب نوع Stream، به نیازهایی مانند دسترسی ترتیبی، قابلیت جستوجو در دادهها، مدیریت منابع و نحوه انتقال اطلاعات توجه کنند و ساختار مناسبتری برای عملیات ورودی و خروجی برنامه در نظر بگیرند.
تفاوت FileStream و MemoryStream در دات نت
FileStream برای خواندن و نوشتن دادهها در فایلهای سیستم استفاده میشود و به برنامه امکان میدهد با اطلاعات ذخیرهشده روی دیسک کار کند. برای مثال، هنگام پردازش یک فایل متنی یا ذخیره محتوای تولیدشده توسط برنامه، میتوان از FileStream استفاده کرد. این روش بهخصوص زمانی مفید است که دادهها باید خارج از حافظه فرایند نگهداری شوند یا حجم آنها بهاندازهای باشد که نگهداری کاملشان در حافظه مناسب نباشد.
در مقابل، MemoryStream دادهها را در حافظه نگهداری میکند و برای سناریوهایی مناسب است که نیاز دارید اطلاعات را بدون ایجاد فایل موقت پردازش کنید. برای مثال، میتوانید دادهها را در یک MemoryStream تولید کنید و سپس آنها را به یک Stream دیگر منتقل کنید. تفاوت این دو کلاس در منبع و مقصد داده و نحوه مصرف منابع مشخص میشود. انتخاب میان آنها باید با توجه به حجم داده، نیاز به ماندگاری اطلاعات و محدودیتهای حافظه انجام شود.
استفاده از NetworkStream و PipeStream در ارتباطات دات نت
NetworkStream برای انتقال داده از طریق ارتباطات شبکه، معمولاً در کنار یک اتصال مبتنی بر TCP، استفاده میشود. این کلاس امکان خواندن و نوشتن دادهها را از طریق اتصال فراهم میکند، اما خود آن ساختار پیامهای سطح بالاتر را تعریف نمیکند. برای مثال، اگر دو برنامه از طریق شبکه با یکدیگر ارتباط برقرار کنند، باید علاوه بر ارسال بایتها، درباره نحوه مشخص کردن مرز پیامها و قالب دادهها نیز تصمیم بگیرند. این موضوع در طراحی پروتکلهای ارتباطی اهمیت دارد.
PipeStream برای ارتباط میان اجزای نرمافزاری از طریق Pipeها کاربرد دارد و میتواند در سناریوهای ارتباط میان فرایندها مورد استفاده قرار بگیرد. این روش برای انتقال داده میان فرایندهایی مناسب است که به یک سازوکار ارتباطی محلی نیاز دارند. تفاوت NetworkStream و PipeStream در نوع ارتباط و محیط استفاده از آنهاست، نه صرفاً در نحوه خواندن و نوشتن دادهها. شناخت این کلاسها به توسعهدهندگان کمک میکند با توجه به معماری برنامه و محل اجرای اجزا، روش انتقال داده مناسبی انتخاب کنند.
مدیریت همزمانی و منابع هنگام کار با Stream
هنگام کار با Streamها، مدیریت منابع اهمیت زیادی دارد، زیرا برخی از آنها به منابع خارجی مانند فایل یا اتصال شبکه وابسته هستند. پس از پایان عملیات، باید منابعی که دیگر موردنیاز نیستند بهدرستی آزاد شوند. در C# استفاده از الگوهایی مانند using میتواند به آزادسازی منابع قابلمدیریت کمک کند. همچنین باید به رفتار هر Stream هنگام بسته شدن توجه داشت، زیرا در برخی موارد یک Stream میتواند از منابع دیگری استفاده کند یا آنها را مدیریت کند.
در برنامههایی که عملیات ورودی و خروجی زمانبر دارند، استفاده از متدهای ناهمگام مانند ReadAsync و WriteAsync میتواند به آزاد ماندن Thread برای انجام کارهای دیگر کمک کند. با این حال، ناهمگام بودن عملیات به معنای امکان اجرای همزمان و بدون محدودیت تمام عملیات روی یک Stream نیست. باید مستندات نوع مورد استفاده و نیازهای همزمانی برنامه را در نظر گرفت. شناخت این ملاحظات، همراه با آشنایی با Stream Adapterها و Decorator Streamها، به طراحی کدهایی قابلاعتمادتر برای پردازش و انتقال داده در دات نت کمک میکند.
سرفصل مطالب آموزش ویدئویی Streaming در دات نت 4.5
فصل اول: معرفی
- مقدمه چرا به یک دوره ی آموزشی Streaming نیاز است؟ بررسی محتوای این بسته ی آموزشی
فصل دوم: معماری Streaming در دات نت
- مقدمه
- Stream های I/O
- Stream چیست؟
- معماری Streaming در دات نت
- کلاس System.IO.Stream
- Stream Pointer (اشاره گر استیریم)
- خواندن از یک Stream
- نوشتن در یک Stream
- Seek کردن در یک Stream
- اشاره گرها و Seek کردن
- از حافظه خارج کردن Stream ها
- بافرها و فلاش کردن
- همروندی در کار با Stream ها و متد Synchronized
- پشتیبانی از همروندی در Stream ها
- انجام تست در کار با Stream ها بدون یک Backing Store - پروپرتی Stream.Null
- جمع بندی
فصل سوم: کار کردن با FileStream در دات نت
- مقدمه
- Backing Store در استیریم های پایه
- ساختن یک FileStream (تنظیم کردن مسیر فایل)
- کار کردن با FileMode و FileAccess
- مبحث FileShare
- کنترل کردن دسترسی ها
- بافر داخلی FileStream
- مبحث مربوط به کش کردن (Caching)
- کش کردن Stream و دسترسی تصادفی و ترتیبی
- گزینه های دیگر کار با فایل ها
- جمع بندی
فصل چهارم: کار کردن با IsolatedStorageFileStream و دسترسی محدود به فایل ها
- مقدمه IsolatedStorage چیست؟ انواع IsolatedStorage ها استفاده از IsolatedStorageFileStream جمع بندی
فصل پنجم: کار کردن با PipeStream و Interprocess Communication
- مقدمه
- Pipe چیست؟
- Pipe های بی نام (Anonymous) و Pipe های با نام (Named)
- استفاده از Named Pipe Server
- استفاده از PipeStream
- استفاده از PipeStream برای انتقال بایت
- انتقال بایت در مقایسه با انتقال پیام
- استفاده از PipeStream برای انتقال پیام
- جمع بندی
فصل ششم: کار کردن با MemoryStream و Memory-Mapped ها در دات نت
- مقدمه
- MemoryStream چیست؟
- استفاده از MemoryStream
- Memory-Mapped File چیست؟
- استفاده از Memory-Mapped File برای دسترسی به فایل
- دسترسی تصادفی به فایل ها با Memory-Mapped File در مقایسه با FileStream
- استفاده از Memory-Mapped File ها برای به اشتراک گذاشتن حافظه
- جمع بندی
فصل هفتم: کار کردن با Web Stream و Network Stream ها در دات نت
- مقدمه
- Web Stream ها
- پشتیبانی از Stream ها در WebRequest و WebResponse
- آموزش عملی کار با WebRequest و WebResponse
- پشتیبانی از Stream ها در WebClient
- آموزش عملی کار با WebClient
- پشتیبانی از Stream ها در HttpClient
- معرفی و آموزش عملی Network Stream
- جمع بندی
فصل هشتم: کار کردن با Decorator Stream ها در دات نت
- مقدمه
- معرفی Decorator Stream ها
- معرفی BufferedStream
- آموزش علمی کار با BufferedStream در NetworkStream
- معرفی DeflateStream و GZipStream در فشرده سازی داده ها
- آموزش عملی کار با Stream های فشرده سازی داده ها
- معرفی CryptoStream
- زنجیر کردن و Dispose کردن Decorator Stream ها
- جمع بندی
فصل نهم: کار کردن با Stream Adapter ها در دات نت
- مقدمه
- معرفی Stream Adapter ها
- معرفی Text Adapter ها: StreamReader/StreamWriter
- کار با Encoding در Text Adapter ها
- آموزش عملی کار با بافر و Position در StreamWriter و StreamReader
- معرفی Binary Adapter ها: BinaryReader/BinaryWriter
- کار با متدهای WriteString و Write و ReadString
- آموزش عملی خواندن و نوشتن در Binary Adapter ها
- معرفی XML Adapter ها: XMLReader/XMLWriter
- آموزش عملی کار با XMLReader و XMLWriter
- بستن Stream Adapter ها
- جمع بندی
فصل دهم: عملیات همروند در کار با Stream ها
- مقدمه
- عملیات CPU Bound و IO Bound به صورت Async و Sync
- ارتباط همروندی و کار با Stream ها
- زمان مناسب استفاده از همروندی در کار با Stream ها
- عملیات همروند در دات نت 4.5
- آموزش عملی کار با HTTPClient
- جمع بندی







