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