Hi,
I have a Dropbox longpoll running as a task, implemented in C# (Xamarin Forms) as the following.
async Task DropboxLongpoll (string cursor, CancellationToken token)
{
var longpollClient = this.GetClient ();
int backoff = 0;
System.Diagnostics.Debug.WriteLine ("Running background longpoll task.");
while (!token.IsCancellationRequested) {
var longpollResults = await longpollClient.Files.ListFolderLongpollAsync (cursor); //default timeout is 30 seconds
System.Diagnostics.Debug.WriteLine ("Changes: " + longpollResults.Changes + " Backoff: " + longpollResults.Backoff.GetValueOrDefault ());
if (longpollResults.Changes) {
var folderResult = await longpollClient.Files.ListFolderContinueAsync (cursor);
cursor = folderResult.Cursor;
DropboxLongpollReportChanges (folderResult);
}
//backoff if present
if (longpollResults.Backoff != null) {
backoff = (int)longpollResults.Backoff.GetValueOrDefault ();
}
System.Diagnostics.Debug.WriteLine ("Backing off longpoll for " + backoff + " seconds");
await Task.Delay (backoff * 1000); //milliseconds delay
}
System.Diagnostics.Debug.WriteLine ("Cancelling task");
longpollClient.Dispose ();
token.ThrowIfCancellationRequested ();
System.Diagnostics.Debug.WriteLine ("Task finished");
}
While I can nicely cancel (i.e., the while loop stops) this task by calling Cancel on the CancellationTokenSource from which I got the token, the Dropbox longpoll task seems to keep running, i.e., listening for changes. I can ignore the changes it reports by modifying this code to the following.
async Task DropboxLongpoll (string cursor, CancellationToken token)
{
var longpollClient = this.GetClient ();
int backoff = 0;
System.Diagnostics.Debug.WriteLine ("Running background longpoll task.");
while (!token.IsCancellationRequested) {
var longpollResults = await longpollClient.Files.ListFolderLongpollAsync (cursor); //default timeout is 30 seconds
if (!token.IsCancellationRequested) { //check if the cancellation is still not requested
System.Diagnostics.Debug.WriteLine ("Changes: " + longpollResults.Changes + " Backoff: " + longpollResults.Backoff.GetValueOrDefault ());
if (longpollResults.Changes) {
var folderResult = await longpollClient.Files.ListFolderContinueAsync (cursor);
cursor = folderResult.Cursor;
DropboxLongpollReportChanges (folderResult);
}
//backoff if present
if (longpollResults.Backoff != null) {
backoff = (int)longpollResults.Backoff.GetValueOrDefault ();
}
System.Diagnostics.Debug.WriteLine ("Backing off longpoll for " + backoff + " seconds");
await Task.Delay (backoff * 1000); //milliseconds delay
} else {
System.Diagnostics.Debug.WriteLine ("Cancelling task");
longpollClient.Dispose ();
token.ThrowIfCancellationRequested ();
}
}
System.Diagnostics.Debug.WriteLine ("Task finished");
}
But, this is just ignoring the detected changes. I believe that the long poll will keep running as a background thread. Will the Dropbox longpoll async task actually cancel? Is there a way to pass the token to the ListFolderLongpollAsync so that it actually cancel when cancellation is requested?