cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
Announcements
What’s new: end-to-end encryption, Replay and Dash updates. Find out more about these updates, new features and more here.

Dropbox API Support & Feedback

Find help with the Dropbox API from other developers.

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Cancelling ListFolderLongpollAsync

Cancelling ListFolderLongpollAsync

xtremebytes
Explorer | Level 3
Go to solution

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?

1 Accepted Solution

Accepted Solutions

Greg-DB
Dropbox Staff
Go to solution
It's not possible to cancel an ongoing request instantly unfortunately, but the long poll request will eventually close or time out on its own. I'll pass this along as a feature request for actual CancellationToken support in the SDK though.

View solution in original post

4 Replies 4

xtremebytes
Explorer | Level 3
Go to solution
System.Diagnostics.Debug.WriteLine ("Task finished"); does not actually get invoked in the second code snippet.

xtremebytes
Explorer | Level 3
Go to solution

The line  token.ThrowIfCancellationRequested (); was not necessary. I realised there is a different reason why the longpoll seemed to be called twice. I had a threading issue with the  DropboxLongpollReportChanges() method. Still, it would be nice to know if the longpoll task is actually getting cancelled so that it doesn't waste resources.

Greg-DB
Dropbox Staff
Go to solution
It's not possible to cancel an ongoing request instantly unfortunately, but the long poll request will eventually close or time out on its own. I'll pass this along as a feature request for actual CancellationToken support in the SDK though.

xtremebytes
Explorer | Level 3
Go to solution
Thanks a lot!
Need more support?
Who's talking

Top contributors to this post

  • User avatar
    xtremebytes Explorer | Level 3
  • User avatar
    Greg-DB Dropbox Staff
What do Dropbox user levels mean?