powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / От чего может виснуть этот код?
44 сообщений из 44, показаны все 2 страниц
От чего может виснуть этот код?
    #40060522
Примерно так:

В form_Load:

Код: c#
1.
2.
3.
4.
5.
6.
new Task(async () =>
{
  await LoadSomeEntities1().ConfigureAwait(false);
  await LoadSomeEntities2().ConfigureAwait(false);
  await LoadSomeEntities3().ConfigureAwait(false);
}).RunSynchronously();



Форма загружается, всё отрабатывает, всё загружено. Никаких проблем!

В combobox_selectedIndexChanged:

Код: c#
1.
LoadSomeEntities3().ConfigureAwait(false).GetAwaiter().GetResult();



А в самой функции:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
async Task LoadSomeEntities3()
{
  trvTreeView.SuspendLayout();
  trvTreeView.BeginUpdate();
  trvTreeView.Nodes.Clear();

  await ReadEntitesFromDB().ConfigureAwait(false); // Но если здесь убрать await и добавить .GetAwaiter().GetResult(), то не виснет
  foreach(var entity in entities)
  {
    if(trvTreeView.InvokeRequired)
    {
      trvTreeView.Invoke((MethodDelegate) delegate // виснет здесь только при выборе значения в комбобоксе
      {
        trvTreeView.Nodes.Add(entity.Name);
      });
    }
    else
    {
       trvTreeView.Nodes.Add(entity.Name);
    }
  }

  if(trvTreeView.InvokeRequired)
  {
    trvTreeView.Invoke((MethodDelegate) delegate 
    {
      trvTreeView.EndUpdate();
      trvTreeView.ResumeLayout();
    }
  }
  else
  {
    trvTreeView.EndUpdate();
    trvTreeView.ResumeLayout();
  }
}



Но стоит сменить значение комбобокса, как тот же самый код виснет на входе в делегат. Чем отличается вызов этого кода при пользовательском вводе от вызова при загрузке формы?

В обоих случаях InvokeRequired = true, соответственно всегда отрабатывает делегат.
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40060529
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бариску Нацарство
Код: c#
1.
await ReadEntitesFromDB().ConfigureAwait(false); // Но если здесь убрать await и добавить .GetAwaiter().GetResult(), то не виснет



потому что так делать нельзя, объяснять долго, нудно, всё это можно найти и почитать в документации.

непонятно зачем так делаете, это просто эксперименты?

https://stackoverflow.com/questions/5095183/how-would-i-run-an-async-taskt-method-synchronously
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40060540
что значит нельзя? так делают все и везде. в чём конкретно претензия?
и зачем мне ссылка на синхронное исполнение асинхронного вызова? синхронно-то оно и так работает.
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40060548
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бариску Нацарство
что значит нельзя?


то и значит.

Бариску Нацарство
так делают все и везде. в чём конкретно претензия?


Код: c#
1.
2.
3.
4.
5.
6.
new Task(async () =>
{
  await LoadSomeEntities1().ConfigureAwait(false);
  await LoadSomeEntities2().ConfigureAwait(false);
  await LoadSomeEntities3().ConfigureAwait(false);
}).RunSynchronously();



так даже в дремучем колхозе делать моветон.


Бариску Нацарство
и зачем мне ссылка на синхронное исполнение асинхронного вызова? синхронно-то оно и так работает.


у вас асинхронный метод

Код: c#
1.
async Task LoadSomeEntities3()



зачем вы в этом методе асинхронный метод пытаетесь вызвать "синхронно"?

Код: c#
1.
await ReadEntitesFromDB().ConfigureAwait(false); // Но если здесь убрать await и добавить .GetAwaiter().GetResult(), то не виснет



зачем убирать await и добавлять GetResult()? это во-первых неправильно, что как бы подтверждается тем, что "виснет", во-вторых.. зачем? это для чего?
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40060549
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бариску Нацарство,

и зачем вы везде .ConfigureAwait(false) добавляете? при чём там, где как раз этого делать нельзя.
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40060553
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бариску Нацарство,

Код: c#
1.
2.
3.
4.
5.
6.
private async void Form1_LoadAsync(object sender, EventArgs e)
{
    await LoadSomeEntities1().ConfigureAwait(false);
    await LoadSomeEntities2().ConfigureAwait(false);
    await LoadSomeEntities3().ConfigureAwait(false);
}


Не нужно их оборачивать в Task и запускать синхронно.
При желании, можно написать так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
private async void Form1_LoadAsync(object sender, EventArgs e)
{
    var t1 = LoadSomeEntities1();
    var t2 = LoadSomeEntities2();
    var t3 = LoadSomeEntities3();
    await Task.WhenAll(t1, t2, t3);
}


Так все три метода будут выполняться одновременно, то есть общее выполнение будет быстрее. Но это если они не обращаются к одним и тем же объектам.


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
async Task LoadSomeEntities1()
{
    trvTreeView.SuspendLayout();
    trvTreeView.BeginUpdate();
    trvTreeView.Nodes.Clear();

    // Возвращаемся в тот же контекст синхронизации,
    // поэтому вызовы Invoke не нужны.
    await ReadEntitesFromDB();

    foreach (var entity in entities)
    {
        trvTreeView.Nodes.Add(entity.Name);
    }

    trvTreeView.EndUpdate();
    trvTreeView.ResumeLayout();
}


И это всё! Суть и красота асинхронности заключена в лаконичности, которую она позволяет.


Код: c#
1.
2.
3.
4.
private async void ComboBox_SelectedIndexChangedAsync(object sender, EventArgs e)
{
    await LoadSomeEntities3();            
}



Ничего не виснет, всё летает!

ЗЫ: у обработчиков событий в сигнатуре должно быть async.
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40060562
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petalvik
ЗЫ: у обработчиков событий в сигнатуре должно быть async.


да, void async-и поддержали только ради событий WinForms
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40060743
Джон Скит из МС утверждает везде что на каждом асинхронном вызове должен висеть .ConfigureAwait(false).
Вы утверждаете, что это делает вызов синхронным. И кому верить?

> зачем убирать await и добавлять GetResult()? это во-первых неправильно, что как бы подтверждается тем, что "виснет", во-вторых.. зачем? это для чего?

чтобы не висло. Вы, кажется, всё перепутали: как "неправильно" не виснет. Как сейчас виснет.
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40060764
petalvik
Бариску Нацарство,
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
async Task LoadSomeEntities1()
{
    trvTreeView.SuspendLayout();
    trvTreeView.BeginUpdate();
    trvTreeView.Nodes.Clear();

    // Возвращаемся в тот же контекст синхронизации,
    // поэтому вызовы Invoke не нужны.
    await ReadEntitesFromDB();

    foreach (var entity in entities)
    {
        trvTreeView.Nodes.Add(entity.Name);
    }

    trvTreeView.EndUpdate();
    trvTreeView.ResumeLayout();
}


И это всё! Суть и красота асинхронности заключена в лаконичности, которую она позволяет.

ЗЫ: у обработчиков событий в сигнатуре должно быть async.


Сделал всё, как Вы советуете выше. Вроде бы всё работает, только две проблемы остались:

await ReadEntitesFromDB(); виснет, если не добавить .ConfigureAwait(false)

и всё-таки добавление нод в trvTreeView по-прежнему бросает исключение об обращении из другой нити, если не оставить .Invoke((MethodDelegate)
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40060773
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бариску Нацарство,

Вот этот код ошибочен:

Код: c#
1.
2.
3.
4.
5.
6.
private async void Form1_LoadAsync(object sender, EventArgs e)
{
    await LoadSomeEntities1().ConfigureAwait(false);
    await LoadSomeEntities2().ConfigureAwait(false);
    await LoadSomeEntities3().ConfigureAwait(false);
}


Здесь нужно убрать .ConfigureAwait(false). Потому что в этих методах происходит обращение к GUI-контролам.
Правильный код:

Код: c#
1.
2.
3.
4.
5.
6.
private async void Form1_LoadAsync(object sender, EventArgs e)
{
    await LoadSomeEntities1();
    await LoadSomeEntities2();
    await LoadSomeEntities3();
}



Теперь не будет бросать исключение.


Бариску Нацарство

await ReadEntitesFromDB(); виснет, если не добавить .ConfigureAwait(false)

Значит код в методе ReadEntitesFromDB() написан неправильно. Наверняка там тоже присобачено .GetAwaiter().GetResult() или что-то ещё. Покажи код.
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40060774
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бариску Нацарство,

И ещё. Вызовы trvTreeView.SuspendLayout(); и trvTreeView.ResumeLayout(); не нужны. Если, конечно, в тривью не добавляются дочерние контролы вызовом trvTreeView.Controls.Add(...);
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40060851
petalvik
Бариску Нацарство,

Вот этот код ошибочен:


Спасибо, всё почистил, всё работает.
Объяснил бы ещё кто зачем тот самый Джон Скит везде пугает не использовать async void и настаивает чтобы на каждом await висел .ConfigureAwait(false). Я поначалу делал именно как Вы советуете, но меня затроллили и много лет заставляли добавлять .ConfigureAwait(false).
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40060857
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бариску Нацарство
Объяснил бы ещё кто зачем тот самый Джон Скит везде пугает не использовать async void и настаивает чтобы на каждом await висел .ConfigureAwait(false). Я поначалу делал именно как Вы советуете, но меня затроллили и много лет заставляли добавлять .ConfigureAwait(false).
А не проще ли взять учебник и прочесть, что делает ConfigureAwait(false) и что такое контекст синхронизации и поток пользовательского интерфейса. Не перепечатывать же учебник на форум.
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40060877
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
да, void async-и поддержали только ради событий WinForms

Почему это? События есть не только в винформс, а много ещё где - в т.ч. в областях, вообще никак не связанных с GUI:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
var timer = new System.Timers.Timer(TimeSpan.FromSeconds(1).TotalMilliseconds)
{
  AutoReset = true,
  Enabled = false
};
timer.Elapsed += TimerElapsed;
timer.Start();
...
static async void TimerElapsed(object sender, System.Timers.ElapsedEventArgs e)
{
  await Task.Delay(TimeSpan.FromSeconds(1));
  Console.WriteLine("Tick: {0}", DateTime.Now);
}
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40060905
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТС ссылку-то не дал, а Джон Скит наверняка имел ввиду - не плодить собственные сигнатуры с async void. А от легаси никуда не денешься, потому это исключение. Да и про ConfugureAwait наверняка указывал те случаи, когда его нельзя применять. Но зачем вникать в детали - давай везде пихать.
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40060922
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бариску Нацарство
Джон Скит из МС утверждает везде что на каждом асинхронном вызове должен висеть .ConfigureAwait(false).
Вы утверждаете, что это делает вызов синхронным. И кому верить?


ничего он такого не утверждает.
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40060923
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
Почему это? События есть не только в винформс, а много ещё где - в т.ч. в областях, вообще никак не связанных с GUI:


за пределами WinForms события лучше не использовать.
и вообще забыть про них как про страшный сон.
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40060928
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
ТС ссылку-то не дал, а Джон Скит наверняка имел ввиду - не плодить собственные сигнатуры с async void.

Об этом пишет не только Скит (который, кстати говоря, давно уже в гугле работает). Вот, например: https://docs.microsoft.com/en-us/archive/blogs/ptorr/async-exceptions-in-c
Причина достаточно банальна: void не содержит информации о контексте выполнения задачи, т.к. это void. И поэтому с void есть вот такое:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
static async Task Main()
{
  AppDomain.CurrentDomain.UnhandledException += (s, e)
    => Console.WriteLine("UnhandledException: {0}", e.ExceptionObject);
  TaskScheduler.UnobservedTaskException += (s, e) =>
    Console.WriteLine("UnobservedTaskException: {0}", e);
  Console.WriteLine("Running TestTask");
  try
  {
    await TestTask();
  }
  catch (Exception e)
  {
    Console.WriteLine("TestTask error: {0}", e);
  }
  Console.WriteLine("Running TestVoid");
  try
  {
    TestVoid(); // здесь await использовать нельзя
  }
  catch (Exception e)
  {
    Console.WriteLine("TestVoid error: {0}", e);
  }
  Console.WriteLine("done");
}

static async void TestVoid()
{
  await Task.Yield();
  throw new ApplicationException("TestVoid");
}

static async Task TestTask()
{
  await Task.Yield();
  throw new ApplicationException("TestVoid");
}


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
Running TestTask
TestTask error: System.ApplicationException: TestVoid
   at test2.Program.<TestTask>d__2.MoveNext() in D:\Projects\.Net\_tests\test2\test2\Program.cs:line 54
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   at test2.Program.<Main>d__0.MoveNext() in D:\Projects\.Net\_tests\test2\test2\Program.cs:line 26
Running TestVoid
done
UnhandledException: System.ApplicationException: TestVoid
   at test2.Program.<TestVoid>d__1.MoveNext() in D:\Projects\.Net\_tests\test2\test2\Program.cs:line 48
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback,
        Object state, Boolean preserveSyncCtx
)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback,
       Object state, Boolean preserveSyncCtx)
   at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
   at System.Threading.ThreadPoolWorkQueue.Dispatch()

Unhandled Exception: System.ApplicationException: TestVoid
   at test2.Program.<TestVoid>d__1.MoveNext() in D:\Projects\.Net\_tests\test2\test2\Program.cs:line 48
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback,
       Object state, Boolean preserveSyncCtx
)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback,
      Object state, Boolean preserveSyncCtx)
   at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
   at System.Threading.ThreadPoolWorkQueue.Dispatch()
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40060931
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
за пределами WinForms события лучше не использовать.
и вообще забыть про них как про страшный сон.

Интересно, как это можно реализовать, например, в случае SqlConnection.InfoMessage (таких примеров можно привести много)
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40060938
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
Интересно, как это можно реализовать, например, в случае SqlConnection.InfoMessage (таких примеров можно привести много)


Согласен, есть легаси контракты, которые до сих пор поддерживаются.
От этих эвентов нужно максимально абстрагироваться и декорировать.
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40061016
hVostt
Бариску Нацарство
Джон Скит из МС утверждает везде что на каждом асинхронном вызове должен висеть .ConfigureAwait(false).
Вы утверждаете, что это делает вызов синхронным. И кому верить?


ничего он такого не утверждает.


Он именно так и утверждает в каждом из его 1000ч постов, которые он плодит на стэкэксчендже и в каждом ссылается на свои блог посты. Везде одно и то же: вешайте .ConfigureAwait(false) на каждый await чтобы не было дедлоков.
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40061020
Shocker.Pro
А не проще ли взять учебник и прочесть

А какой учебник?

Я 5 лет работал в компании, где, в соответствии утверждениям Скита, .ConfigureAwait(false) висел на каждом await, и мои пулл реквесты не одобряли, пока я не добавлял их. Объяснить, зачем они это требуют, правда тоже не могли.
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40061036
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бариску Нацарство
Везде одно и то же: вешайте .ConfigureAwait(false) на каждый await чтобы не было дедлоков.

Блин, а просто самому прочтитать доки о том, что делает .ConfigureAwait(...) сложно, что ли?
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40061118
fkthat
Бариску Нацарство
Везде одно и то же: вешайте .ConfigureAwait(false) на каждый await чтобы не было дедлоков.

Блин, а просто самому прочтитать доки о том, что делает .ConfigureAwait(...) сложно, что ли?


Configures the awaiter to await this Task<TResult>.

true to attempt to marshal the continuation back to the original context captured; otherwise, false.

И что это мне должно сказать?
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40061138
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40061141
felix_ff


много пиндосских букв. моего мозга не хватает чтобы всё это постичь. так нужен конфигюр или не нужен?
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40061145
petalvik
Бариску Нацарство,

Вот этот код ошибочен:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
Правильный код:

[src c#]
private async void Form1_LoadAsync(object sender, EventArgs e)
{
    await LoadSomeEntities1();
    await LoadSomeEntities2();
    await LoadSomeEntities3();
}




Почему даже после этого методы Load...() исполняются последовательно?
В логах видно, что каждый следующий стартует только после окончания предыдущего. Разве они не должны стартовать одновременно и заканчиваться, как успеют?
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40061173
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бариску Нацарство
Почему даже после этого методы Load...() исполняются последовательно?

ОМГ, а как же они еще должны выполняться по-твоему, если перед каждым стоит await?

Я еще раз говорю - погугль, почитай доки и т.п. чтобы разобраться для чего вообще ConfigureAwait нужен.
подсказка - можешь сразу просто гуглить что такое synchronization context
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40061188
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бариску Нацарство
много пиндосских букв. моего мозга не хватает чтобы всё это постичь. так нужен конфигюр или не нужен?


Не нужен.
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40061194
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Не нужен.

Вообще-то нужен когда х/з что и как будет твой код вызывать. Линтеры так-то на его отсутствие ворчат. Я обычно просто из-за этого пишу, хотя лично мне-то он как раз вообще пофиг, т.к. работаю только с ASP.NET Core.
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40061214
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бариску Нацарство
так нужен конфигюр или не нужен?
Блин, зависит от способа использования. В случае неиспользования в одном случае - дедлок, в случае использования - в другом случае - проблемы с контекстом синхронизации. Как это объяснить в двух словах, если ты за пять лет не смог в этом разобраться (даже в await)? Не получается учебник на английском - возьми перевод - Троелсен, Албахари и т.п., везде разжевывается многопоточность и с чем ее едят, что такое таски, что такое аваиты и т.п.
Бариску Нацарство
Я 5 лет работал в компании, где, в соответствии утверждениям Скита, .ConfigureAwait(false) висел на каждом await, и мои пулл реквесты не одобряли, пока я не добавлял их.
Ну так может вы писали код там, где не было контекста синхронизации. Ты выдернул проблематику из контекста и пытаешься теперь везде ее пихать, да еще прикрываешь своё незнание ссылкой на авторитеты.
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40061222
fkthat
ОМГ, а как же они еще должны выполняться по-твоему, если перед каждым стоит await?


а зачем тогда нужны эти async и его await, если всё равно как выполнялось синхронно, так и выполняется?
гораздо проще старые, проверенные Task.Run(). Они-то по крайней мере точно выполняются параллельно.
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40061224
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бариску Нацарство
а зачем тогда нужны эти async и его await, если всё равно как выполнялось синхронно, так и выполняется?
гораздо проще старые, проверенные Task.Run(). Они-то по крайней мере точно выполняются параллельно.
О боже. Знания о многопоточности даже не на уровне юниора.
Будешь читать учебник, заодно посмотри, чем отличается асинхронность от многопоточности.
За книжки бегом!
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40061242
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
Не нужен.

Вообще-то нужен когда х/з что и как будет твой код вызывать. Линтеры так-то на его отсутствие ворчат. Я обычно просто из-за этого пишу, хотя лично мне-то он как раз вообще пофиг, т.к. работаю только с ASP.NET Core.


Ток для библиотек. Можно даже Fody настроить, чтобы автоматом добавлял.
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40061243
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бариску Нацарство
а зачем тогда нужны эти async и его await, если всё равно как выполнялось синхронно, так и выполняется?
гораздо проще старые, проверенные Task.Run(). Они-то по крайней мере точно выполняются параллельно.


Ну вот и используйте Task.Run().
Главное чтобы вас лично всё устраивало.
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40061244
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Ток для библиотек.

Ну да, я это и имел в виду под "х/з кто будет вызывать".

hVostt
Можно даже Fody настроить, чтобы автоматом добавлял.

Так даже студия это умеет по "Ctrl+точка".
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40061246
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Ну вот и используйте Task.Run().

Судя по тому что пишет автор, представляю что это будет :))
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40061247
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Так даже студия это умеет по "Ctrl+точка".


Fody немного иначе работает, он модифицирует dll, добавляя туда вызовы для каждого await.
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40061248
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
Ну вот и используйте Task.Run().

Судя по тому что пишет автор, представляю что это будет :))


Будет очередной легаси :)
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40061303
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Бариску Нацарство
Почему даже после этого методы Load...() исполняются последовательно?

ОМГ, а как же они еще должны выполняться по-твоему, если перед каждым стоит await?

Я еще раз говорю - погугль, почитай доки и т.п. чтобы разобраться для чего вообще ConfigureAwait нужен.

Не. Тут сначала нужно читать про то, как вообще await устроен и действует. Налицо факт полного непонимания основных концепций этой фичи.
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40069132
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бариску Нацарство

Код: c#
1.
2.
3.
4.
5.
6.
private async void Form1_LoadAsync(object sender, EventArgs e)
{
    await LoadSomeEntities1();
    await LoadSomeEntities2();
    await LoadSomeEntities3();
}



Почему даже после этого методы Load...() исполняются последовательно?


Потому что перед каждым стоит await.

Так они будут выполняться одновременно:

Код: c#
1.
2.
3.
4.
5.
6.
7.
private async void Form1_LoadAsync(object sender, EventArgs e)
{
    var t1 = LoadSomeEntities1();
    var t2 = LoadSomeEntities2();
    var t3 = LoadSomeEntities3();
    await Task.WhenAll(t1, t2, t3);
}


Но это если они не обращаются к одним и тем же объектам. Конкуррентный доступ, все дела...

Бариску Нацарство

а зачем тогда нужны эти async и его await, если всё равно как выполнялось синхронно, так и выполняется?
гораздо проще старые, проверенные Task.Run(). Они-то по крайней мере точно выполняются параллельно.


Вызов await LoadSomeEntities1(); не подвешивает текущий поток. Например, GUI продолжает отрисовываться и реагировать на действия пользователя.
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40069135
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробую объяснить простыми словами, зачем всё-таки нужен ConfigureAwait.

Когда мы пишем вот так:

Код: c#
1.
2.
3.
await ReadEntitesFromDB();
// или так
await ReadEntitesFromDB().ConfigureAwait(true);



То перед вызовом этого метода захватывается контекст. А после его окончания выполнение возвращается в этот же контекст. Грубо говоря, в тот же поток.
Но этот поток может быть занят какой-то другой задачей. Например, поток GUI может делать отрисовку в событии Paint. Поэтому может быть существенная задержка - ожидание освобождения потока.

А если мы напишем так:

Код: c#
1.
await ReadEntitesFromDB().ConfigureAwait(false);


То после окончания выполнения метода продолжение может быть сделано в любом свободном на этот момент потоке.
Поэтому использование ConfigureAwait(false) в целом ускоряет выполнение, устраняя лишние ожидания.

Поэтому в библиотечном коде рекомендуется практически всегда использовать именно false.

Однако в коде приложения не всегда можно продолжить выполнение в другом потоке.
В частности, если нужно обратиться к контролам формы (TreeView). Обращаться к ним можно только из того потока, в котором они были созданы. Поэтому без ConfigureAwait(false) придётся использовать Invoke. А с ним этого не нужно - мы гарантированно вернулись в нужный поток.
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40069148
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дело не в потоках, а контексте выполнения/синхронизации, забудь слово потоки
...
Рейтинг: 0 / 0
От чего может виснуть этот код?
    #40069383
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes
дело не в потоках, а контексте выполнения/синхронизации, забудь слово потоки


Наоборот. Всё дело в потоках.
Консольные приложения никогда не имели контекста синхронизации. В ASP.NET Core SynchronizationContext тоже выпилили. Так куда возвращается выполнение после завершения асинхронного кода?
...
Рейтинг: 0 / 0
44 сообщений из 44, показаны все 2 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / От чего может виснуть этот код?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]