More .NET libraries
-
Rebex Total Pack
All Rebex .NET libraries together
Back to feature list...
Asynchronous operations
On this page:
Task-based Asynchronous Pattern (.NET 4.0 or later)
.NET 4.0 introduced the Task-based Asynchronous Pattern (TAP). Rebex ZIP supports it as well, just reference the assemblies for .NET 4.0 from your project.
// start async operation Task<ZipItemCollection> t = zip.GetItemsAsync(); // set continuation method t.ContinueWith(GetItemsFinished);
' start async operation Dim t As Task(Of ZipItemCollection) = zip.GetItemsAsync() ' set continuation method t.ContinueWith(AddressOf GetItemsFinished)
Sample asynchronous continuation method:
// this method is called when the async operation is completed private void GetItemsFinished(Task<ZipItemCollection> t) { // show error if any if (t.IsFaulted) { Console.WriteLine("An error occurred: {0}", t.Exception.ToString()); return; } // show cancel notification if (t.IsCanceled) { Console.WriteLine("Operation was canceled."); return; } // get operation result ZipItemCollection list = t.Result; // show result Console.WriteLine("Listed {0} item(s).", list.Count); }
' this method is called when the async operation is completed Private Sub GetItemsFinished(t As Task(Of ZipItemCollection)) ' show error if any If t.IsFaulted Then Console.WriteLine("An error occurred: {0}", t.Exception.ToString()) Return End If ' show cancel notification If t.IsCanceled Then Console.WriteLine("Operation was canceled.") Return End If ' get operation result Dim list As ZipItemCollection = t.Result ' show result Console.WriteLine("Listed {0} item(s).", list.Count) End Sub
'await' operator support (.NET 4.5 or later)
.NET 4.5 introduced the 'await' operator, which makes writing asynchronous code more easy than ever before. Rebex ZIP supports it as well, just reference the assemblies for .NET 4.0 from your project.
private async Task GetItems() { try { // get list asynchronously ZipItemCollection list = await zip.GetItemsAsync(); // show result Console.WriteLine("Listed {0} item(s).", list.Count); } catch (ZipException ex) { if (ex.ProblemType == ArchiveProblemType.OperationCanceled) Console.WriteLine("Operation was canceled."); else Console.WriteLine("An error occurred: {0}.", ex.Message); } catch (Exception ex) { Console.WriteLine("An error occurred: {0}", ex.ToString()); } }
Private Async Sub GetItems() Try ' get list asynchronously Dim list As ZipItemCollection = Await zip.GetItemsAsync() ' show result Console.WriteLine("Listed {0} item(s).", list.Count) Catch ex As ZipException If ex.ProblemType = ArchiveProblemType.OperationCanceled Then Console.WriteLine("Operation was canceled.") Else Console.WriteLine("An error occurred: {0}.", ex.Message) End If Catch ex As Exception Console.WriteLine("An error occurred: {0}", ex.ToString()) End Try End Sub
Event-based Asynchronous Pattern
The Event-based Asynchronous Pattern (EAP), was introduced in .NET 2.0. When you reference Rebex assemblies for .NET 2.0 in your project, this is the pattern you can use.
// register completed event handler zip.GetItemsCompleted += zip_GetItemsCompleted; // start async operation zip.GetItemsAsync();
' register completed event handler AddHandler zip.GetItemsCompleted, AddressOf GetItemsCompleted ' start async operation zip.GetItemsAsync()
Sample asynchronous event handler method:
// this method is called when the asynchronous method has completed private void zip_GetItemsCompleted(object sender, ZipGetItemsCompletedEventArgs e) { // show error if any if (e.Error != null) { Console.WriteLine("An error occurred: {0}", e.Error.ToString()); return; } // show cancel notification if (e.Cancelled) { Console.WriteLine("Operation was canceled."); return; } // get operation result ZipItemCollection list = e.Result; // show result Console.WriteLine("Listed {0} item(s).", list.Count); }
' this method is called when the Async method is completed Private Sub GetItemsCompleted(sender As Object, e As ZipGetItemsCompletedEventArgs) ' show error if any If e.Error IsNot Nothing Then Console.WriteLine("An error occurred: {0}", e.Error.ToString()) Return End If ' show cancel notification If e.Cancelled Then Console.WriteLine("Operation was canceled.") Return End If ' get operation result Dim list As ZipItemCollection = e.Result ' show result Console.WriteLine("Listed {0} item(s).", list.Count) End Sub
SynchronizationContext support for events
When an asynchronous method on the ZipArchive
object raises an event, it's dispatched using the
synchronization context
captured when the operation was started.
This greatly simplifies writing GUI applications (Windows Forms and WPF) because all the events are raised
on the applications GUI thread, eliminating the need to explicitly
marshal the calls
using the Invoke
method.
If you need to disable this functionality,
set ZipArchive.Options.RaiseEventsFromCurrentThread
to true
.
This will cause all the events to be raised on the background operation's thread.
Back to feature list...