تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
نظرة عامة حول Event-based Asynchronous Pattern
#2
عندما نتحدث عن Event-based Asynchronous Pattern فإننا سنتحدث بالتأكيد عن مجموعة من الفئات والأنواع التي تم تصميمها خصيصاً لهذا ال Pattern والتي نجدها ضمن مجالي الأسماء System.Threading و System.ComponentModel وهي بالتحديد:

AsyncOperation
AsyncOperationManager
AsyncCompletedEventArgs
PogressChangedEventArgs

وبعض ال Delegate المعرفة سابقًا ضمن الدوت نت مثلل AsyncCallBack و SendOrPostCallBack

عندما يتم مناداة إجراء غير متزامن MethodNameAsync فإنه عادة يتم إنشاء نسخة من الفئة AsyncOperation والتي تعمل كوسيط بين ال Component أو الفئة التي تقوم ببنائها والبيئة التي ستعمل عليها سواء كان تطبيق Windows Forms أو تطبيق WPF أو تطبيق ASP.NET, أهم خصائص هذه الفئة هو الخاصية UserSuppliedState والتي يمكن من خلالها التمييز بين كل عملية, وأيضاً أهم إجراءين في هذه الفئة هما Post و PosOperationCompleted حيث تستخدم Post لإطلاق الحدث MethodNameProgressChanged بينما تستخدم PostOperationCompleted لإنهاء العملية وإطلاق الحدث MethodNameCompleted ,

والطريقة الشرعية الوحيدة لإنشاء نسخة من الفئة AsyncOperation هي استخدام فئة أخرى مساعدة وهي AsyncOperationManager واستخدام الإجراء المشترك CreateOperation بحيث يتم تمرير كائن من نوع Object وهو يمثل القيمة التي تميز كل AsyncOperation عن مثيلتها وستصبح هذه القيمة هي نفسها قيمة الخاصية UserSuppliedState.

المثال التالي عبارة عن Component بسيط يطبق هذا ال Pattern وقد أسميته AsynchronousStreamCopy ومن اسمه يتض أنه يقوم بنسخ Stream داخل Stream آخر , وهذا ال Component مفيد أحياناً عندما تقوم بنسخ ملفات ذات حجم كبير مع ملاحظة انه يمكن استخدامه مع أي فئة اخرى مشتقة من الفئة IO.Stream , و هو يحتوي إجراء واحد غير متزامن وهو CopyStreamAsync وهو إجراء Overloaded بحيث يتم في الأصل تمرير ثلاث وسيطات وهي ال Stream المصدر والذي سيتم نسخه و ال Stream الوجهة الذي سيتم النسخ إليه ووسيط ثالث يمثل القيمة الفريدة التي ستمرر للإجراء AsyncOperationManager.CreateOperation , والنسخة الثانية من هذا الإجراء تقوم فقط باستقبال ال Streams التي سيتم العمل عليها دون الحاجة لتمرير وسيط ثالث وفي هذه الحالة لن تتمكن من القيام بأكثر من استدعاء واحد للإجراء CopyStreamAsync وإذا قمت بذلك سيتم إطلاق الاستثناء InvalidOperationException. باللإضافة إلى الإجراء CancelAsync والذي يقوم بإيقاف أي عملية متزامنة تتم حالياً وهو أيضًا إجراء Overloaded بحيث يقبل وسيط واحد userState من نوع Object وهو نفسه الذي تم تمريره للإجراء CopyStreamAsync, ويعبر عن نفس العملية,

ملاخظة: إذا لم تقم بتمرير الوسيط الثالث للإجراء CopyStreamAsync فمن المفترض عند استدعاء الإجراء CancelAsync ألا تمرّر أي وسيط وإلا سيحدث استثناء.

بالنسبة لكيفية نسخ ال Streams فسيتم الاعتماد على الإجراءات الغير متزامنة للفئة Stream مثل BeginRead و EndRead و Beginwrite وهو ما سيوضحه المثال.

أيضًا تم إنشاء Delegates خاصة بالأحداث StreamCopyProgressChanged و StreamCopyCompleted

هذا الكود الخاص بالفئة StreamCopyProgressChangedEventArgs


كود :
Imports System.IO
Imports System.ComponentModel

Public Class StreamCopyProgressChangedEventArgs
Inherits ProgressChangedEventArgs

Private _bytesCopied As Long

Public Sub New(ByVal bytesCopied As Long _
, ByVal userState As Object _
, ByVal percentage As Integer)
MyBase.New(percentage, userState)
Me._bytesCopied = bytesCopied
End Sub


Public ReadOnly Property BytesCopied() As Long
Get
Return Me._bytesCopied
End Get
End Property

End Class
قمت ايضًا بعمل فءة اخرى مساعدة وهي StreamContainer والتي ستحمل معلومات حول ال Streams وال AsyncOperation المرتبطة بها من أجل تمريرها للإجراءات BeginRead و BeginWrite.


كود :
Imports System.IO
Imports System.ComponentModel

Public NotInheritable Class StreamsContainer
Implements IStreamContainer

Private _Position As Integer
Private _BytesRead As Long
Private _source As Stream = Nothing
Private _destination As Stream = Nothing
Private _operation As AsyncOperation
Private _buffer() As Byte

Public Sub New(ByVal sourceStream As Stream, ByVal destinationStream As Stream _
, ByVal asyncOperation As AsyncOperation _
, ByVal bufferSize As Integer)
If sourceStream Is Nothing OrElse sourceStream.Equals(Stream.Null) Then
Throw New ArgumentNullException("sourceStream")
End If
If destinationStream Is Nothing OrElse sourceStream.Equals(Stream.Null) Then
Throw New ArgumentNullException("destinationStream")
End If
Me._operation = asyncOperation
Me._source = sourceStream
Me._destination = destinationStream
Me._buffer = New Byte(BufferSize) {}
Me.ValidateInternal()
End Sub
Public ReadOnly Property SourceStream() As Stream Implements IStreamContainer.SourceStream
Get
Return _source
End Get
End Property

Public ReadOnly Property DestinationStream() As Stream Implements IStreamContainer.DestinationStream
Get
Return _destination
End Get
End Property

Public Overrides Function ToString() As String
Return String.Format( _
"Source stream length in bytes: {0}, Destination stream length in bytes: {1}" _
, Me._source.Length, Me._destination.Length)
End Function

Private Sub ValidateInternal()
If Not _source.CanRead Then
Throw New IOException("Source stream is Write-only")
End If
If _source.Length = 0 Then
Throw New Exception("Source stream is empty.")
End If
If Not _destination.CanWrite Then
Throw New IOException("Destination stream is Read-only")
End If
End Sub

Public ReadOnly Property Operation() As AsyncOperation
Get
Return _operation
End Get
End Property

Public ReadOnly Property Buffer() As Byte()
Get
Return Me._buffer
End Get
End Property

Public Property Position() As Long
Get
Return _Position
End Get
Set(ByVal value As Long)
_Position = value
End Set
End Property

End Class
وهذه هي Delegates الخاصة بالأخداث:


كود :
Imports System.ComponentModel

Public Delegate Sub StreamCopyCompletedEventHandler(ByVal e As AsyncCompletedEventArgs)

Public Delegate Sub StreamCopyProgressChangedEventHandler(ByVal e As StreamCopyProgressChangedEventArgs)
}}}
تم الشكر بواسطة:


الردود في هذا الموضوع
نظرة عامة حول Event-based Asynchronous Pattern - بواسطة Raggi Tech - 08-10-12, 05:43 PM

المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  نظرة سريعة في الجديد في Visual Studio 2008 فيما يتعلق ببيئة التطوير RaggiTech 0 2,081 08-10-12, 05:45 PM
آخر رد: RaggiTech
  نظرة على جديد الفيجوال بيسك 9 - الجزء الأول RaggiTech 0 2,258 08-10-12, 05:38 PM
آخر رد: RaggiTech

التنقل السريع :


يقوم بقرائة الموضوع: