/// <summary>Uploads data in a string to the specified resource, asynchronously.</summary> /// <param name="webClient">The WebClient.</param> /// <param name="address">The URI to which the data should be uploaded.</param> /// <param name="method">The HTTP method that should be used to upload the data.</param> /// <param name="data">The data to upload.</param> /// <returns>A Task containing the data in the response from the upload.</returns> public static Task <string> UploadStringTask(this WebClient webClient, Uri address, string method, string data) { // Create the task to be returned var tcs = new TaskCompletionSource <string>(address); // Setup the callback event handler UploadStringCompletedEventHandler handler = null; handler = (sender, e) => EAPCommon.HandleCompletion(tcs, e, () => e.Result, () => webClient.UploadStringCompleted -= handler); webClient.UploadStringCompleted += handler; // Start the async work try { webClient.UploadStringAsync(address, method, data, tcs); } catch (Exception exc) { // If something goes wrong kicking off the async work, // unregister the callback and cancel the created task webClient.UploadStringCompleted -= handler; tcs.TrySetException(exc); } // Return the task that represents the async operation return(tcs.Task); }
/// <summary>Downloads the resource with the specified URI to a local file, asynchronously.</summary> /// <param name="webClient">The WebClient.</param> /// <param name="address">The URI from which to download data.</param> /// <param name="fileName">The name of the local file that is to receive the data.</param> /// <returns>A Task that contains the downloaded data.</returns> public static Task DownloadFileTask(this WebClient webClient, Uri address, string fileName) { // Create the task to be returned var tcs = new TaskCompletionSource <object>(address); // Setup the callback event handler AsyncCompletedEventHandler handler = null; handler = (sender, e) => EAPCommon.HandleCompletion(tcs, e, () => null, () => webClient.DownloadFileCompleted -= handler); webClient.DownloadFileCompleted += handler; // Start the async work try { webClient.DownloadFileAsync(address, fileName, tcs); } catch (Exception exc) { // If something goes wrong kicking off the async work, // unregister the callback and cancel the created task webClient.DownloadFileCompleted -= handler; tcs.TrySetException(exc); } // Return the task that represents the async operation return(tcs.Task); }
/// <summary>The core implementation of SendTask.</summary> /// <param name="smtpClient">The client.</param> /// <param name="userToken">The user-supplied state.</param> /// <param name="sendAsync"> /// A delegate that initiates the asynchronous send. /// The provided TaskCompletionSource must be passed as the user-supplied state to the actual SmtpClient.SendAsync method. /// </param> /// <returns></returns> private static Task SendTaskCore(SmtpClient smtpClient, object userToken, Action <TaskCompletionSource <object> > sendAsync) { // Validate we're being used with a real smtpClient. The rest of the arg validation // will happen in the call to sendAsync. if (smtpClient == null) { throw new ArgumentNullException("smtpClient"); } // Create a TaskCompletionSource to represent the operation var tcs = new TaskCompletionSource <object>(userToken); // Register a handler that will transfer completion results to the TCS Task SendCompletedEventHandler handler = null; handler = (sender, e) => EAPCommon.HandleCompletion(tcs, e, () => null, () => smtpClient.SendCompleted -= handler); smtpClient.SendCompleted += handler; // Try to start the async operation. If starting it fails (due to parameter validation) // unregister the handler before allowing the exception to propagate. try { sendAsync(tcs); } catch (Exception exc) { smtpClient.SendCompleted -= handler; tcs.TrySetException(exc); } // Return the task to represent the asynchronous operation return(tcs.Task); }