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...