خوب حالا یکم حرفه ای ترش کنیم.
شاید موقعی که دارین نرم افزار هاتون رو تست می کنین دیده باشین که موقعی که داره از Sql Server اطلاعات میاره اگه یکم تعداد رکورد ها زیاد باشه نرم افزارتون Freeze میشه و به نظر میرسه که قفل شده. البته دلیلش کاملا واضحه. مثلا موقعی که می خواهید یه Grid رو بوسیله یک DataSet که با SqlDataAdpater پر میشه نشون بدین این اتفاق رو باید دیده باشین. (تصویر 1)
برای اینکه این اتفاق نیافته و توی اون مدت زمانی که طول میکشه تا نرم افزارتون اطلاعات رو از بانک بیاره کار معمولش رو هم ادامه بده باید از روش asynchronous programming استفاده کنین. به این معنی که درخواست آوردن رکورد ها رو توی یک Thread دیگه انجام بدیم. و به محض اینکه جواب اومد اونوقت نمایش بدیم.
برای این موضوع در کلاس SqlCommnad به ازاء سه تا از متد های که در ابتدای این نوشتار توضیح دادیم یک متد متناظر با پیشوند Begin.... وجود داره و همین طور یک متد متناظر با پسوند End.... یعنی:
کد:
BeginExecuteNonQuery()
BeginExecuteReader()
BeginExecuteXmlReader()
EndExecuteNonQuery()
EndExecuteReader()
EndExecuteXmlReader()
اما این متد ها چیست و به چه درد می خوره؟
خوب فرض کنین که شما یک فرم داریم که داخلش یک Grid داره . حالا من می خوام موقعی که Form_Load اتفاق میافته گرید من هم پر بشه و نمایش داده بشه. حالا اگه اینکار برای تعداد رکورد های زیادی انجام بشه اونوقت یکم زمان می بره. کاری که می خوام انجام بدم اینکه فرم من بالا بیاد و بعد داخل یک Thread دیگه پر کردن اطلاعات برای نمایش انجام بشه. هر وقت که کار پر کردن تمام شد اونوقت نشونشون بدم.
نمونه کد رو به پیوست براتون میذارم. فقط چند تا نکته هست که باید توضیح بدم.
وقتی شما دارین از BeginExecute استفاده می کنین باید دقت کنین که نتیجه رو در همان لحظه به شما نمی دهد. در عوض از طریق یک Delegate که یک متد بدون خروجی و با یک Parameter از نوع IAsyncResult شما باید EndExecute رو فراخوانی کنین و نتیجه رو از طریق EndExecute... بگیرین. (تصویر 2)
نکته آخر داشت یادم می رفت اینکه حتما باید در ConnectionString تون امکان استفاده از Asyncronize method ها رو با اضافه کردن Asynchronous Processing=true فعال کنین.
توی این مثال برای اینکه نشون بدم Async چیست یک کلید Add داریم که همزمان با اجرای SqlCommand مون میتونه به لیست اضافه کنه. و یک Label هم وضعیت Command رو نشون میده. و تا موقعی که دوباره Ready نشه امکان بستن فرم رو نداریم.





