Переписать асинхронный метод без использования async/await - C#
Формулировка задачи:
Ломаю голову как переписать асинхронный метод что бы достичь того же эффекта как при использовании async/await.
К примеру(пример взят из учебника Скит Д. С# для профессионалов.Тонкости программирования.Третье издание)
Как постигнуть такой же результат при исполнении но обычным методом. То есть без использования await.
К примеру у меня вышло что то такое:
Однако, хоть GetAwaiter() и возвращает сразу же управление работающему потоку, UI продолжит своё выполнение, то есть можно с легкостью написать MessadgeBox, и он его покажет не дожидаясь заврешения Task. Как подождать завершение работы Task, не блокируя UI поток, но при это и не продолжая его работы.
Собственно что и делает await.
Листинг программы
- private async void DisplayWebSiteLengthAsync(object sender, EventArgs e)
- {
- label.Text = "Fetching...";
- using (HttpClient client = new HttpClient())
- {
- string text = await client.GetStringAsync("https://habrahabr.ru/");
- label.Text = text.Length.ToString();
- }
- }
Листинг программы
- private void DisplayWebSiteLength(object sender, EventArgs e)
- {
- label.Text = "Fetching...";
- using (WebClient client = new WebClient())
- {
- var text = Task.Run(() => client.DownloadString("https://habrahabr.ru/"))
- .GetAwaiter();
- text.OnCompleted(() => label.Text = text.GetResult().Length.ToString());
- }
- }
Решение задачи: «Переписать асинхронный метод без использования async/await»
textual
Листинг программы
- // WindowsFormsApplication1.Form1
- [DebuggerStepThrough, AsyncStateMachine(typeof(Form1.<DisplayWebSiteLengthAsync>d__2))]
- private void DisplayWebSiteLengthAsync(object sender, EventArgs e)
- {
- Form1.<DisplayWebSiteLengthAsync>d__2 <DisplayWebSiteLengthAsync>d__ = new Form1.<DisplayWebSiteLengthAsync>d__2();
- <DisplayWebSiteLengthAsync>d__.<>4__this = this;
- <DisplayWebSiteLengthAsync>d__.sender = sender;
- <DisplayWebSiteLengthAsync>d__.e = e;
- <DisplayWebSiteLengthAsync>d__.<>t__builder = AsyncVoidMethodBuilder.Create();
- <DisplayWebSiteLengthAsync>d__.<>1__state = -1;
- AsyncVoidMethodBuilder <>t__builder = <DisplayWebSiteLengthAsync>d__.<>t__builder;
- <>t__builder.Start<Form1.<DisplayWebSiteLengthAsync>d__2>(ref <DisplayWebSiteLengthAsync>d__);
- }
- private sealed class <DisplayWebSiteLengthAsync>d__2 : IAsyncStateMachine
- {
- public int <>1__state;
- public AsyncVoidMethodBuilder <>t__builder;
- public object sender;
- public EventArgs e;
- public Form1 <>4__this;
- private HttpClient <client>5__1;
- private string <text>5__2;
- private string <>s__3;
- private TaskAwaiter<string> <>u__1;
- void IAsyncStateMachine.MoveNext()
- {
- int num = this.<>1__state;
- try
- {
- if (num != 0)
- {
- this.<>4__this.label.Text = "Fetching...";
- this.<client>5__1 = new HttpClient();
- }
- try
- {
- TaskAwaiter<string> taskAwaiter;
- if (num != 0)
- {
- taskAwaiter = this.<client>5__1.GetStringAsync("https://habrahabr.ru/").GetAwaiter();
- if (!taskAwaiter.IsCompleted)
- {
- num = (this.<>1__state = 0);
- this.<>u__1 = taskAwaiter;
- Form1.<DisplayWebSiteLengthAsync>d__2 <DisplayWebSiteLengthAsync>d__ = this;
- this.<>t__builder.AwaitUnsafeOnCompleted<TaskAwaiter<string>, Form1.<DisplayWebSiteLengthAsync>d__2>(ref taskAwaiter, ref <DisplayWebSiteLengthAsync>d__);
- return;
- }
- }
- else
- {
- taskAwaiter = this.<>u__1;
- this.<>u__1 = default(TaskAwaiter<string>);
- num = (this.<>1__state = -1);
- }
- string result = taskAwaiter.GetResult();
- taskAwaiter = default(TaskAwaiter<string>);
- this.<>s__3 = result;
- this.<text>5__2 = this.<>s__3;
- this.<>s__3 = null;
- this.<>4__this.label.Text = this.<text>5__2.Length.ToString();
- this.<text>5__2 = null;
- }
- finally
- {
- if (num < 0 && this.<client>5__1 != null)
- {
- ((IDisposable)this.<client>5__1).Dispose();
- }
- }
- this.<client>5__1 = null;
- }
- catch (Exception exception)
- {
- this.<>1__state = -2;
- this.<>t__builder.SetException(exception);
- return;
- }
- this.<>1__state = -2;
- this.<>t__builder.SetResult();
- }
- [DebuggerHidden]
- void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine)
- {
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д