I have used the following code to copy files, which gives me the error for large files saying "OutOfMemoryException".
I have the dot net 4 so i can't use ".ReadAsync()". Please give me the sample code so that I can achieve the asynchronous file copy....Code:Private Sub ReadFilesInC() ' make a reference to a directory Dim di As New IO.DirectoryInfo("c:\") Dim diar1 As IO.FileInfo() = di.GetFiles() Dim dra As IO.FileInfo 'list the names of all files in the specified directory For Each dra In diar1 ReadData(dra.FullName) Next End Sub Public Function ReadData(ByVal Path As String) '--This is the state object that will contain the file '---and the return data. This class is nescessary because '---we dont want the return data overwritten by each '---read method (like it would if it was declared globally) Dim tempStateObj As New StateObj '--Open up the file we wish to read tempStateObj.file = New System.IO.FileStream(Path, IO.FileMode.Open) '--Redimension the return data array to the appropriate length ReDim tempStateObj.retData(tempStateObj.file.Length) '--Call the Asynch read method. Pass the byte array we wish to fill '---the offset, the length of the file to read, the address of the '---callback sub, and finally a state object for our own use. tempStateObj.file.BeginRead(tempStateObj.retData, 0, tempStateObj.file.Length, _ New AsyncCallback(AddressOf OnReadDone), tempStateObj) '--Control is immediately given back to the program. The BeginRead method '---Does not block program execution like the Read method, so we are free to '---get back to processing. Debug.WriteLine("BeginRead done: " & Path) '--To show that this is a normal thread and not threadpooled: Debug.WriteLine(System.Threading.Thread.CurrentThread.IsThreadPoolThread) End Function Public Sub OnReadDone(ByVal ar As IAsyncResult) '--This is the asynchronous callback delegate that is called when the BeginRead '---is done processing. '--The state object is passed to us in ar. It is a generic '---IAsyncResult, and must be casted into something usable '---We know we passed a StateObj class, so we cast it as such Dim state As StateObj = CType(ar, StateObj) '--From our state object, we must call EndRead(ar) to get the '---number of bytes read. Even if you do not wish to know the '---number of bytes, you must *always* call EndRead in the callback Dim bytesRecieved As Int32 = state.file.EndRead(ar) '--If you don't wish to know the number of bytes read, do this: 'state.file.EndRead(ar) state.file.Close() '--Just to prove that this thread is running in a Threadpool object that '---is managed by the OS: Debug.WriteLine(System.Threading.Thread.CurrentThread.IsThreadPoolThread) '--Open up a new file to write to state.file = New System.IO.FileStream("C:\Somewhere\data.txt.FileMode.Create") '--Begin the Asynch write to the file, passing everything and the state object again state.file.BeginWrite(state.retData, 0, state.retData.Length, New AsyncCallback(AddressOf OnWriteDone), state) '--At this point, the sub will terminate and the thread will go back to the '---internal threadpool. It is important not to do anything that will block or take '---large amounts of time in this sub. The internal threadpool is limited to '---25 threads total, and it is important to return the thread as quick as possible '---to the pool for further use. End Sub Public Sub OnWriteDone(ByVal ar As IAsyncResult) '--This is the asynchronous callback delegate that is called when the BeginWrite '---is done processing. '--The state object is passed to us in ar. It is a generic '---IAsyncResult, and must be casted into something usable '---We know we passed a StateObj class, so we cast it as such Dim state As StateObj = CType(ar, StateObj) '--From our state object, we must call EndWrite(ar). You must '---*always* call EndWrite in the callback state.file.EndWrite(ar) state.file.Close() '--At this point, the sub will terminate and the thread will go back to the '---internal threadpool. It is important not to do anything that will block or take '---large amounts of time in this sub. The internal threadpool is limited to '---25 threads total, and it is important to return the thread as quick as possible '---to the pool for further use. End Sub '---------- '--Our StateObj Class '---------- Public Class StateObj Public file As System.IO.FileStream Public retData() As Byte End Class




Reply With Quote
