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

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

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

Ломаю голову как переписать асинхронный метод что бы достичь того же эффекта как при использовании async/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();
            }
        }
Как постигнуть такой же результат при исполнении но обычным методом. То есть без использования await. К примеру у меня вышло что то такое:
        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());
            }
        }
Однако, хоть GetAwaiter() и возвращает сразу же управление работающему потоку, UI продолжит своё выполнение, то есть можно с легкостью написать MessadgeBox, и он его покажет не дожидаясь заврешения Task. Как подождать завершение работы Task, не блокируя UI поток, но при это и не продолжая его работы. Собственно что и делает await.

Решение задачи: «Переписать асинхронный метод без использования 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)
            {
            }
        }

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


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

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

9   голосов , оценка 4.222 из 5
Похожие ответы