the_king
مدیرکل انجمن
خیلی ممنون استاد علی
توی vss ، تابع BackupComplete که اصلا ورودی و خروجی ای نداره (نمیدونم با این حال به درد کجا میخوره) . تابع BeginBackupComplete را اگه سر آخر (بعد از متد DoSnapshotSet) فراخونی کنیم ، انگار اگه برای عملیات بکاپ مشکلی پیش نیاد و توابع های فراخونی شده ، Exception ای را ندن ، تابع BeginBackupComplete درست فراخونی میشه وگرنه اگه اون متدهای مربوط به عملیات بکاپ ، Exception را پرتاب کنن ، متد BeginBackupComplete هم موقع فراخونی ، خطای VssBadStateException رو میده . پس آیا از این حالت خطا دادن یا ندادن متد BeginBackupComplete میشه متوجه شد که بکاپ ، موفقیت آمیز بود یا نه؟
ورودی و خروجی BackupComplete رو برای چه منظوری لازم دارید؟ BackupComplete برای اینه که برنامه شما بتونه اعلام کنه که عملیات Backup با موفقیت خاتمه یافته، همین. اگر خطایی رخ بده شما با Exception ها با خبر شده اید. وقتی شما عملیاتی انجام دادید که با خطا و Exception مشخص کرده که درست انجام نشده، چرا می خواهید رخداد BackupComplete رو ایجاد کنید؟ میخواهید VSS رو فریب بدید یا فکر می کنید اون Exception رو باید نادیده بگیرید؟ لزومی نداره که وقتی متوجه خطا شدید، متد دیگری رو اجرا کنید که میدونید با اجراش خطای جدیدی ایجاد میشه.
خیر درست نیست. همچین عبارتی چطور میتونه درست باشه؟ اگر کلاس Parallel و کلاس Task ها چیزی نباشند جز اینکه نخ ها و thread های جدید ایجاد بکنند پس اولا چه فرقی بین Parallel و Task و Thread قائل شدید، ثانیا کل ساختارشون رو با چه معیاری مشابه فرض کردید؟اون سئوال قبلی یعنی سئوال "پس کلاس Parallel و کلاس Task ها چیزی نیستن جز اینکه نخ ها و thread های جدید ایجاد میکنن؟" جوابش چیه؟ درسته؟
در حالت عادی وقتی روتینی رو فراخوانی می کنیم از ابتدا تا انتها توسط نخ فراخوان اجرا میشه، فرضا اگر داخلش فایلی رو کپی کنیم تا اتمام کپی دستورات بعدی در نخ اجرا نمیشه.و اینکه درباره ی async و aware ، یه کم توضیح میدین؟
و اگر داخل روتینی، عملیاتی رو با نخ جدیدی اجرا کنیم، توقف ای در اجرای دستورات بعدی نخ فراخوان پیش نمیاد و ممکنه هر کدوم از نخ های فراخوان و جدید کارشون زودتر از دیگری خاتمه پیدا کنه، فرضا اگر در نخ جدید فایلی رو کپی کنیم، معلوم نیست که نخ اصلی زودتر به اتمام دستورات روتین اش میرسه یا کپی کردن فایل در نخ جدید.
اما معمولا در برنامه نویسی شرایطی پیش میاد که نخ فراخوان باید عملیاتی رو حتما بعد از اتمام اجرای نخ جدید انجام بده، فرضا نخ فراخوان متنی رو حتما بعد از کپی شدن فایل توسط نخ جدید در فرم نشون بده.
در اینجور مواقع await میتونه نخ فراخوان رو به سادگی برای اتمام اجرای نخ جدید منتظر نگهداره.
async مشخص میکنه که این روتین قراره یکسری عملیاتی رو بصورت ناهمگام انجام بده، یعنی داخلش عملا بجز نخ فراخوان یک نخ دیگه هم بکار خواهد رفت. دستورات داخل روتین در حالت عادی و با نخ فراخوان اجرا خواهند شد، مگر در جایی که با await مشخص بشه، یعنی اگر await ای در کار نباشه، خود async به تنهایی کاری انجام نمیده. وجود async یک راهنما است برای اینکه مشخص بشه حتما await یا await هایی در این روتین وجود داره.
await مشخص میکنه که فراخوانی فلان عملیات باید مجزا از نخ فراخوان انجام بشه و نخ فراخوان تا پایان عملیاتش منتظر خواهد موند و دستور بعدی رو اجرا نمی کنه مگر اینکه کار نخ جدید تموم بشه.