عنوان دقیقترِ پست: استفاده از کی-ورد await بجای جنگولک بازیهایِ من-درآوردیِ معمول...!

فرض کنید بعنوان یک مثال خیلی عمومی میخوایم مقدار زیادی اطلاعات از دیتابیس بگیریم (یا بطور کلی کاری بکنیم که کمی وقتگیر هست و Thread جاری رو چند لحظه ای مشغول میکنه) و نمیخوایم هم که این اتفاق بیوفته چون مثلا فرمی که الان کاربر داره باهاش کارمیکنه قفل میشه و یجورایی احساس خوشآیندی به کاربر نمیده!
برای حل این مشکل اصولا هرکس میتونه برای خودش راه حلی داشته باشه و همه راه حلها هم درست کار کنن. ولی استفاده از کی-ورد await میتونه از خیلی از اینها راحتتر باشه:
(تو این کد فرض کنید متد GetData که یه DataTable برمیگردونه، مدت زمان چند ثانیه وقت میگیره و مشکلمون اون هست و نمیخوایم مثلا فرممون اصطلاحا قفل بشه).


// Create new task
Task<DataTable> dataTask = new Task<DataTable>(GetData);

//this will actually "pause" the code execution until the task completes. It doesn't lock the thread, but rather waits for the result, similar to an async callback
DataTable table = await dataTask;

listBoxControl.DataContext = table;


که توضیحات داخل کد گویا هست به نظرم.
حتی میشه استفاده رو بهتر کرد (یعنی مثلا قبل از شروع به کار یه صفحه ای چیزی به کاربر نشون داده بشه، و بعد از اتمام کار هم اون صفحه بسته بشه):


//create and run a new task
Task<DataTable> dataTask = new Task<DataTable>(GetData);

//run some other code immediately after this task is started and running
ShowLoaderControl();
StartStoryboard();

//this will actually "pause" the code execution until the task completes. It doesn't lock the thread, but rather waits for the result, similar to an async callback
DataTable table = await dataTask;

//Now we can perform operations on the Task result, as if we're executing code after the async operation completed
listBoxControl.DataContext = table;
StopStoryboard();
HideLoaderControl();



منبع کد: http://stackoverflow.com/questions/4...-await-feature