سلام
دستورات گفته شده تا این لحظه همه از ریسمان جاری استفاده میکنند و تا اتمام کار ریسمان بلوکه میشود.
در نتیجه باید از چند ریسمانی استفاده کنیم، یا خودمان اقدام به ساخت ریسمان جدید کنیم و یا از جفت دستورات BeginXXXXX و EndXXXXX استفاده کنیم.
دستورات نا همزمان نسبت به دستورات مشابه عادی دو پارامتر بیشتر میگیرند.
requestCallback As System.AsyncCallback
state As Object
پارامتر اول هندلر و اشاره گر روالی است که در پایان عملیان فراخانی میشود.
پارامتر دوم هم اختیاری است و میتواند هر مقداری داشته باشد، هر چه به این مقدار بدهید در اجرای روال پایانی به شما داده میشود و به نوعی شما میتوانید وضعیت جاری و یا مقداری برای مشخص کردند حالات مختلف را ارسال کنید.
روال پایانی که در انتهای انجام عمل ناهمزمان اجرا میشود و باید اشاره گر آن به پارامتر requestCallback داده شود دارای امضا و فرمت زیر است.
'VB.Net
Sub MethodName (ByVal ar As System.IAsyncResult)
//C#.Net
void MethodName (System.IAsyncResult ar)
ar که به ما تحویل داده میشود مشخص کنند مواردی از جمله موفقت و اتمام صحیح عملیات و همان پارامتر state هم است (البته با نام AsyncState)
برای اتمام کلی فرایند و چرخه اجرا، این پارامتر ar باید به EndXXXXX پاس داده شود و اگر عملیات مقدار بازگشتی هم داشته باشد EndXXXXX ان را به ما میدهد.
به مثال فرضی زیر دقت کنید.
'VB.Net
'Synchronous
Dim ret As TypeName = ClassVariantName.FunctionName(125)
'...
'=====
'VB.Net
'Asynchronous
ClassVariantName.BeginFunctionName(125, AddressOf MethodName, "Mahdi")
Private Sub MethodName (ByVal ar As System.IAsyncResult)
' "Mahdi" === ar.AsyncState
Dim ret As TypeName = ClassVariantName.EndFunctionName(ar)
'...
End Sub
//C#.Net
//Synchronous
TypeName ret = ClassVariantName.FunctionName(125);
//...
//=====
//C#.Net
///Asynchronous
ClassVariantName.BeginFunctionName(125, new System.AsyncCallback(MethodName), "Mahdi");
private void MethodName (System.IAsyncResult ar)
{
// "Mahdi" === ar.AsyncState;
TypeName ret = ClassVariantName.EndFunctionName(ar);
//...
}
فراموش نکنید مزیت روش غیر همزمان آن است که ریسمان شما بلوکه نمیشود و شما میتوانید به کارهای دیگر برسید و هر موقع عملیات تکمیل شد، روال پایانی اجرا میشود و مقدار بازگشتی را هم تحویل میگیرید.
مطالب فوق را قابل تعمیم بیان کردم و عیناً میتوانید برای هر کلاسسی در دات نت که جفت روال BeginXXXXX و EndXXXXX را دارد اجرا کنید، از جمله:
BeginConnect و BeginAccept و BeginSend و BeginReceive و...
کافی است تست کنید.