:: Не фоксом единым
Асинхронность 3
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Читал www.oszone.net . Дошёл до места:

Цитата:
Декомпилятор промежуточного языка (IL) раскроет истинную природу этой функции после компиляции, сгенерировав вывод, аналогичный тому, что показано на рис. 1

И подумалось - а почему бы и мне не скачать декомпилятор, и не посмотреть. Вдруг - врёт многоуважаемый автор

Скачал JetBrains DotPeak. Скомпилил программку, открыл её в DotPeak - и вижу точно такой же код, как компилировал. Т.е. эта сволочь поняла, что это async. Порылся в нете, наткнулся на ILSpy ilspy.net . Написано:

Цитата:
ILSpy requires the .NET Framework 4.0.

Т.е. про async он ни чего не знает. Скачал, открыл программку - всё отлично.
Ratings: 0 negative/0 positive
Асинхронность 3
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Исходная программа (взята из статьи):

public static async Task SimpleBodyAsync()
{
Console.WriteLine("Hello, Async World!");
}
static void Main(string[] args)
{
SimpleBodyAsync();
Console.ReadLine();
}

Получившийся после декомпиляци код

[DebuggerStepThrough, AsyncStateMachine(typeof(Program.<SimpleBodyAsync>d__0))]
public static Task SimpleBodyAsync()
{
Program.<SimpleBodyAsync>d__0 <SimpleBodyAsync>d__ = new Program.<SimpleBodyAsync>d__0();
<SimpleBodyAsync>d__.<>t__builder = AsyncTaskMethodBuilder.Create();
<SimpleBodyAsync>d__.<>1__state = -1;
AsyncTaskMethodBuilder <>t__builder = <SimpleBodyAsync>d__.<>t__builder;
<>t__builder.Start<Program.<SimpleBodyAsync>d__0>(ref <SimpleBodyAsync>d__);
return <SimpleBodyAsync>d__.<>t__builder.Task;
}
private static void Main(string[] args)
{
Program.SimpleBodyAsync();
Console.ReadLine();
}

В общем - автор соврал. Шучу. Что то не так... А где, кстати, "Hello, Async World!"?



Исправлено 7 раз(а). Последнее : S-type, 24.08.17 21:57
Ratings: 0 negative/0 positive
Re: Асинхронность 3
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
У автора же получился код:

[DebuggerStepThrough]
public static Task SimpleBodyAsync() {
<SimpleBodyAsync>d__0 d__ = new <SimpleBodyAsync>d__0();
d__.<>t__builder = AsyncTaskMethodBuilder.Create();
d__.MoveNext();
return d__.<>t__builder.Task;
}
[CompilerGenerated]
[StructLayout(LayoutKind.Sequential)]
private struct <SimpleBodyAsync>d__0 : <>t__IStateMachine {
private int <>1__state;
public AsyncTaskMethodBuilder <>t__builder;
public Action <>t__MoveNextDelegate;
public void MoveNext() {
try {
if (this.<>1__state == -1) return;
Console.WriteLine("Hello, Async World!");
}
catch (Exception e) {
this.<>1__state = -1;
this.<>t__builder.SetException(e);
return;
}
this.<>1__state = -1;
this.<>t__builder.SetResult();
}
...
}


Получившийся код совсем не похож на тот, что написал автор. То ли декомпилятор я взял неправильный, то ли со времён, когда автор статью писал много воды утекло.



Исправлено 2 раз(а). Последнее : S-type, 24.08.17 21:38
Ratings: 0 negative/0 positive
Re: Асинхронность 3
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Полез в гугл. Нашёл статью habrahabr.ru

Там дан пример:

// static - это уже я добавил
public static async Task<Int32> MethodTaskAsync()
{
Int32 one = 33;
await Task.Delay(1000);
return one;
}

Добавил вызывающий код:

static void Main(string[] args)
{
Task<Int32> task= MethodTaskAsync();
task.Wait();
Console.WriteLine(task.Result);
Console.ReadLine();
}

Декомпилировал, вижу:

[DebuggerStepThrough, AsyncStateMachine(typeof(Program.<MethodTaskAsync>d__0))]
public static Task<int> MethodTaskAsync()
{
Program.<MethodTaskAsync>d__0 <MethodTaskAsync>d__ = new Program.<MethodTaskAsync>d__0();
<MethodTaskAsync>d__.<>t__builder = AsyncTaskMethodBuilder<int>.Create();
<MethodTaskAsync>d__.<>1__state = -1;
AsyncTaskMethodBuilder<int> <>t__builder = <MethodTaskAsync>d__.<>t__builder;
<>t__builder.Start<Program.<MethodTaskAsync>d__0>(ref <MethodTaskAsync>d__);
return <MethodTaskAsync>d__.<>t__builder.Task;
}

У автора:

[AsyncStateMachine(typeof(Program.<MethodTaskAsync>d__0))]
public Task<int> MethodTaskAsync()
{
Program.<MethodTaskAsync>d__0 <MethodTaskAsync>d__ = new Program.<MethodTaskAsync>d__0();
<MethodTaskAsync>d__.<>4__this = this; // понятно, у меня же static
<MethodTaskAsync>d__.<>t__builder = AsyncTaskMethodBuilder<int>.Create();
<MethodTask>d__.<>1__state = -1;
AsyncTaskMethodBuilder<int> <>t__builder = <MethodTaskAsync>d__.<>t__builder;
<>t__builder.Start<Program.<MethodTaskAsync>d__0>(ref <MethodTaskAsync>d__);
return <MethodTaskAsync>d__.<>t__builder.Task;
}

В общем, код "один в один".
Ratings: 0 negative/0 positive
Re: Асинхронность 3
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Статья на www.oszone.net это перевод msdn.microsoft.com Не может же статья на msdn.microsoft.com врать? Устарело? Другой декомпилятор? Как это понимать?
Ratings: 0 negative/0 positive
Re: Асинхронность 3
leonid

Сообщений: 3202
Откуда: Рига
Дата регистрации: 03.02.2006
S-type
Статья на www.oszone.net это перевод msdn.microsoft.com Не может же статья на msdn.microsoft.com врать?

Цитата:
Не читайте перед обедом советских газет

Ни ту, ни другую не читал. Статья на msdn.microsoft.com в принципе врать может, но это достаточно маловероятно. А вот то, что любой перевод врет, и порой достаточно сильно, уверен практически на 100%.
Ratings: 0 negative/0 positive
Re: Асинхронность 3
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
S-type
В общем - автор соврал. Шучу. Что то не так... А где, кстати, "Hello, Async World!"?
В классе Program.<SimpleBodyAsync>d__0 который ты не посмотрел.

dotpeek, вероятно, умеет восстанавливать асинки (а равно и многое другое "синтетическое"). но может где в настройках и есть галка это отключающая.
попробуй лучше dnSpy


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Асинхронность 3
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Igor Korolyov
В классе Program.<SimpleBodyAsync>d__0 который ты не посмотрел.

Не вижу Не даёт ILSpy такого класса.

[attachment 28249 s2.png]


Igor Korolyov
dotpeek, вероятно, умеет восстанавливать асинки (а равно и многое другое "синтетическое"). но может где в настройках и есть галка это отключающая.
Зашёл в Tools \ Option \ Decompiler поставил галочку "Show compiler-generated code". Теперь вижу:

public static Task SimpleBodyAsync()
{
Program.\u003CSimpleBodyAsync\u003Ed__0 stateMachine = new Program.\u003CSimpleBodyAsync\u003Ed__0();
stateMachine.\u003C\u003Et__builder = AsyncTaskMethodBuilder.Create();
stateMachine.\u003C\u003E1__state = -1;
stateMachine.\u003C\u003Et__builder.Start<Program.\u003CSimpleBodyAsync\u003Ed__0>(ref stateMachine);
return stateMachine.\u003C\u003Et__builder.Task;
}
private static void Main(string[] args)
{
Program.SimpleBodyAsync();
Console.ReadLine();
}
[CompilerGenerated]
private sealed class \u003CSimpleBodyAsync\u003Ed__0 : IAsyncStateMachine
{
public int \u003C\u003E1__state;
public AsyncTaskMethodBuilder \u003C\u003Et__builder;
public \u003CSimpleBodyAsync\u003Ed__0()
{
base.\u002Ector();
}
void IAsyncStateMachine.MoveNext()
{
int num = this.\u003C\u003E1__state;
try
{
Console.WriteLine("Hello, Async World!");
}
catch (Exception ex)
{
this.\u003C\u003E1__state = -2;
this.\u003C\u003Et__builder.SetException(ex);
return;
}
this.\u003C\u003E1__state = -2;
this.\u003C\u003Et__builder.SetResult();
}
[DebuggerHidden]
void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine)
{
}
}


Igor Korolyov
попробуй лучше dnSpy
Завтра попробую.



Исправлено 1 раз(а). Последнее : S-type, 25.08.17 00:14
Ratings: 0 negative/0 positive
Re: Асинхронность 3
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Igor Korolyov
попробуй лучше dnSpy

Открыл - и сразу влюбился. Потому, как всё по-русски. И, когда в настройках установил галочку "Показывать скрытые типы и методы, созданные компилятором" видел:

[CompilerGenerated]
private sealed class <SimpleBodyAsync>d__0 : IAsyncStateMachine
{
// Token: 0x06000004 RID: 4 RVA: 0x0000209F File Offset: 0x0000029F
public <SimpleBodyAsync>d__0()
{
}
// Token: 0x06000005 RID: 5 RVA: 0x000020A8 File Offset: 0x000002A8
void IAsyncStateMachine.MoveNext()
{
int num = this.<>1__state;
try
{
Console.WriteLine("Hello, Async World!");
}
catch (Exception exception)
{
this.<>1__state = -2;
this.<>t__builder.SetException(exception);
return;
}
this.<>1__state = -2;
this.<>t__builder.SetResult();
}
// Token: 0x06000006 RID: 6 RVA: 0x00002108 File Offset: 0x00000308
[DebuggerHidden]
void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine)
{
}
// Token: 0x04000001 RID: 1
public int <>1__state;
// Token: 0x04000002 RID: 2
public AsyncTaskMethodBuilder <>t__builder;
}
Ratings: 0 negative/0 positive
Re: Асинхронность 3
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
А если снять галочку "Декомпилировать асинхронные методы (async/await)" можно увидеть:

// Token: 0x06000001 RID: 1 RVA: 0x00002050 File Offset: 0x00000250
[DebuggerStepThrough]
public static Task SimpleBodyAsync()
{
Program.<SimpleBodyAsync>d__0 <SimpleBodyAsync>d__ = new Program.<SimpleBodyAsync>d__0();
<SimpleBodyAsync>d__.<>t__builder = AsyncTaskMethodBuilder.Create();
<SimpleBodyAsync>d__.<>1__state = -1;
AsyncTaskMethodBuilder <>t__builder = <SimpleBodyAsync>d__.<>t__builder;
<>t__builder.Start<Program.<SimpleBodyAsync>d__0>(ref <SimpleBodyAsync>d__);
return <SimpleBodyAsync>d__.<>t__builder.Task;
}
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 4 (Гостей: 4)

© 2000-2024 Fox Club 
Яндекс.Метрика