Переписать асинхронный метод без использования async/await - C#

Узнай цену своей работы

Формулировка задачи:

Ломаю голову как переписать асинхронный метод что бы достичь того же эффекта как при использовании async/await. К примеру(пример взят из учебника Скит Д. С# для профессионалов.Тонкости программирования.Третье издание)
Листинг программы
  1. private async void DisplayWebSiteLengthAsync(object sender, EventArgs e)
  2. {
  3. label.Text = "Fetching...";
  4. using (HttpClient client = new HttpClient())
  5. {
  6. string text = await client.GetStringAsync("https://habrahabr.ru/");
  7. label.Text = text.Length.ToString();
  8. }
  9. }
Как постигнуть такой же результат при исполнении но обычным методом. То есть без использования await. К примеру у меня вышло что то такое:
Листинг программы
  1. private void DisplayWebSiteLength(object sender, EventArgs e)
  2. {
  3. label.Text = "Fetching...";
  4. using (WebClient client = new WebClient())
  5. {
  6. var text = Task.Run(() => client.DownloadString("https://habrahabr.ru/"))
  7. .GetAwaiter();
  8. text.OnCompleted(() => label.Text = text.GetResult().Length.ToString());
  9. }
  10. }
Однако, хоть GetAwaiter() и возвращает сразу же управление работающему потоку, UI продолжит своё выполнение, то есть можно с легкостью написать MessadgeBox, и он его покажет не дожидаясь заврешения Task. Как подождать завершение работы Task, не блокируя UI поток, но при это и не продолжая его работы. Собственно что и делает await.

Решение задачи: «Переписать асинхронный метод без использования async/await»

textual
Листинг программы
  1.         // WindowsFormsApplication1.Form1
  2.         [DebuggerStepThrough, AsyncStateMachine(typeof(Form1.<DisplayWebSiteLengthAsync>d__2))]
  3.         private void DisplayWebSiteLengthAsync(object sender, EventArgs e)
  4.         {
  5.             Form1.<DisplayWebSiteLengthAsync>d__2 <DisplayWebSiteLengthAsync>d__ = new Form1.<DisplayWebSiteLengthAsync>d__2();
  6.             <DisplayWebSiteLengthAsync>d__.<>4__this = this;
  7.             <DisplayWebSiteLengthAsync>d__.sender = sender;
  8.             <DisplayWebSiteLengthAsync>d__.e = e;
  9.             <DisplayWebSiteLengthAsync>d__.<>t__builder = AsyncVoidMethodBuilder.Create();
  10.             <DisplayWebSiteLengthAsync>d__.<>1__state = -1;
  11.             AsyncVoidMethodBuilder <>t__builder = <DisplayWebSiteLengthAsync>d__.<>t__builder;
  12.             <>t__builder.Start<Form1.<DisplayWebSiteLengthAsync>d__2>(ref <DisplayWebSiteLengthAsync>d__);
  13.         }
  14.  
  15.         private sealed class <DisplayWebSiteLengthAsync>d__2 : IAsyncStateMachine
  16.         {
  17.             public int <>1__state;
  18.  
  19.             public AsyncVoidMethodBuilder <>t__builder;
  20.  
  21.             public object sender;
  22.  
  23.             public EventArgs e;
  24.  
  25.             public Form1 <>4__this;
  26.  
  27.             private HttpClient <client>5__1;
  28.  
  29.             private string <text>5__2;
  30.  
  31.             private string <>s__3;
  32.  
  33.             private TaskAwaiter<string> <>u__1;
  34.  
  35.             void IAsyncStateMachine.MoveNext()
  36.             {
  37.                 int num = this.<>1__state;
  38.                 try
  39.                 {
  40.                     if (num != 0)
  41.                     {
  42.                         this.<>4__this.label.Text = "Fetching...";
  43.                         this.<client>5__1 = new HttpClient();
  44.                     }
  45.                     try
  46.                     {
  47.                         TaskAwaiter<string> taskAwaiter;
  48.                         if (num != 0)
  49.                         {
  50.                             taskAwaiter = this.<client>5__1.GetStringAsync("https://habrahabr.ru/").GetAwaiter();
  51.                             if (!taskAwaiter.IsCompleted)
  52.                             {
  53.                                 num = (this.<>1__state = 0);
  54.                                 this.<>u__1 = taskAwaiter;
  55.                                 Form1.<DisplayWebSiteLengthAsync>d__2 <DisplayWebSiteLengthAsync>d__ = this;
  56.                                 this.<>t__builder.AwaitUnsafeOnCompleted<TaskAwaiter<string>, Form1.<DisplayWebSiteLengthAsync>d__2>(ref taskAwaiter, ref <DisplayWebSiteLengthAsync>d__);
  57.                                 return;
  58.                             }
  59.                         }
  60.                         else
  61.                         {
  62.                             taskAwaiter = this.<>u__1;
  63.                             this.<>u__1 = default(TaskAwaiter<string>);
  64.                             num = (this.<>1__state = -1);
  65.                         }
  66.                         string result = taskAwaiter.GetResult();
  67.                         taskAwaiter = default(TaskAwaiter<string>);
  68.                         this.<>s__3 = result;
  69.                         this.<text>5__2 = this.<>s__3;
  70.                         this.<>s__3 = null;
  71.                         this.<>4__this.label.Text = this.<text>5__2.Length.ToString();
  72.                         this.<text>5__2 = null;
  73.                     }
  74.                     finally
  75.                     {
  76.                         if (num < 0 && this.<client>5__1 != null)
  77.                         {
  78.                             ((IDisposable)this.<client>5__1).Dispose();
  79.                         }
  80.                     }
  81.                     this.<client>5__1 = null;
  82.                 }
  83.                 catch (Exception exception)
  84.                 {
  85.                     this.<>1__state = -2;
  86.                     this.<>t__builder.SetException(exception);
  87.                     return;
  88.                 }
  89.                 this.<>1__state = -2;
  90.                 this.<>t__builder.SetResult();
  91.             }
  92.  
  93.             [DebuggerHidden]
  94.             void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine)
  95.             {
  96.             }
  97.         }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.222 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы