Переписать асинхронный метод без использования 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) { } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д