Advertisement
Fhernd

MainWindow.xaml.cs

Jun 24th, 2016
1,874
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.78 KB | None | 0 0
  1. using System;
  2. using System.Threading;
  3. using System.Threading.Tasks;
  4. using System.Windows;
  5. using System.Windows.Input;
  6.  
  7. namespace R0409
  8. {
  9.     /// <summary>
  10.     /// Interaction logic for MainWindow.xaml
  11.     /// </summary>
  12.     public partial class MainWindow : Window
  13.     {
  14.         /// <summary>
  15.         /// Constructor de la ventana principal de la aplicación.
  16.         /// </summary>
  17.         public MainWindow()
  18.         {
  19.             InitializeComponent();
  20.         }
  21.  
  22.         /// <summary>
  23.         /// Responde al clic del botón que invoca a una tarea de forma sincrónica.
  24.         /// </summary>
  25.         /// <param name="sender">Objeto que genera el evento.</param>
  26.         /// <param name="e">Parámetros de la llamada al evento.</param>
  27.         void ButtonSync_Click(object sender, RoutedEventArgs e)
  28.         {
  29.             ContentTextBlock.Text = String.Empty;
  30.             try
  31.             {
  32.                 string resultado = Tarea().Result;
  33.                 ContentTextBlock.Text = resultado;
  34.             }
  35.             catch (Exception ex)
  36.             {
  37.                 ContentTextBlock.Text = ex.InnerException.Message;
  38.             }
  39.         }
  40.  
  41.         /// <summary>
  42.         /// Responde a clic de llamada a tarea de forma asincrónica.
  43.         /// No tiene acceso al control `ContextTextBlock`.
  44.         /// </summary>
  45.         /// <param name="sender">Objeto que genera el evento.</param>
  46.         /// <param name="e">Parámetros de la llamada al evento.</param>
  47.         void ButtonAsync_Click(object sender, RoutedEventArgs e)
  48.         {
  49.             ContentTextBlock.Text = String.Empty;
  50.             Mouse.OverrideCursor = Cursors.Wait;
  51.             Task<String> tarea = Tarea();
  52.  
  53.             tarea.ContinueWith(t =>
  54.             {
  55.                 ContentTextBlock.Text = t.Exception.InnerException.Message;
  56.                 Mouse.OverrideCursor = Cursor;
  57.             }, CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted,
  58.                 TaskScheduler.FromCurrentSynchronizationContext());
  59.         }
  60.  
  61.         /// <summary>
  62.         /// Responde a clic de llamada a tarea de forma asincrónica.
  63.         /// Tiene acceso al control `ContextTextBlock`.
  64.         /// </summary>
  65.         /// <param name="sender"></param>
  66.         /// <param name="e"></param>
  67.         void ButtonAsyncOK_Click(object sender, RoutedEventArgs e)
  68.         {
  69.             ContentTextBlock.Text = String.Empty;
  70.             Mouse.OverrideCursor = Cursors.Wait;
  71.             Task<String> tarea = Tarea(TaskScheduler.FromCurrentSynchronizationContext());
  72.  
  73.             tarea.ContinueWith(t => {
  74.                 Mouse.OverrideCursor = null;
  75.                 ContentTextBlock.Text = tarea.Result;
  76.             },
  77.                 CancellationToken.None,
  78.                 TaskContinuationOptions.None,
  79.                 TaskScheduler.FromCurrentSynchronizationContext());
  80.         }
  81.  
  82.         Task<String> Tarea()
  83.         {
  84.             return Tarea(TaskScheduler.Default);
  85.         }
  86.  
  87.         /// <summary>
  88.         /// Método para ejecución asincrónica.
  89.         /// </summary>
  90.         /// <param name="scheduler">Manejador de la ejecución asincrónica.</param>
  91.         /// <returns>Respuesta de la ejecución del thread.</returns>
  92.         Task<String> Tarea(TaskScheduler scheduler)
  93.         {
  94.             Task retraso = Task.Delay(TimeSpan.FromSeconds(5));
  95.  
  96.             return retraso.ContinueWith( t =>
  97.             {
  98.                 string mensaje = String.Format("Tarea ejecutándose en el ID de thread {0}. " +
  99.                     "¿Thread en pool de threads?: {1}", Thread.CurrentThread.ManagedThreadId,
  100.                     Thread.CurrentThread.IsThreadPoolThread);
  101.  
  102.                 ContentTextBlock.Text = mensaje;
  103.  
  104.                 return mensaje;
  105.             }, scheduler);
  106.         }
  107.     }
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement