Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Task.ConfigureAwait объясните. / 6 сообщений из 6, страница 1 из 1
28.02.2016, 18:33
    #39180922
Awaiter
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Task.ConfigureAwait объясните.
Подскажите, нужно ли использовать Task.ConfigureAwait везде, во всех метода библиотеки которую пишу.
Или только во "внешнем" методе который вызывается "снаружи" библиотеки. А уже внутри библиотеки вызывать методы между собой без Task.ConfigureAwait ?

Как я это понимаю. НЕ нужно писать Task.ConfigureAwait только, и единственно, в местах, где есть синхронизационный контекст. Например при вызове из формы метод библиотеки, возвращающей Task. А внутри библиотек везде, где есть await он обязательно должен быть дополнен Task.ConfigureAwait:


Короче. Так верно ?
Код: 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.
protected void button_Click(object sender, EventArgs e)
        {
            string result = await myLib.GetResultAsync ();   
            label1.text = result
        }

public class MyLib
{
  public async Task<string> GetResultAsync ()
  {
     return await GetResultAsyncInternal1().ConfigureAwait(false);
  }

  private async Task<string> GetResultAsyncInternal1 ()
  {
     return await GetResultAsyncInternal2().ConfigureAwait(false); // ок ?
  }

  private async Task<string> GetResultAsyncInternal2 ()
  {
     await Task.Delay (1000).ConfigureAwait(false);  // и тут верно ?
     return "Test";
  }

}



Верно ли написано в button_Click ? Там ведь не нужен ConfigureAwait ?

Как я понимаю. Писать там ConfigureAwait(false) вообще не верно ! В этом случае после вызова метода GetResultAsync дальнейшее управление уйдет в пул потоков, а из него нельзя будет обращаться к label1. Я все верно понимаю ?
...
Рейтинг: 0 / 0
29.02.2016, 05:32
    #39181040
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Task.ConfigureAwait объясните.
использовать надо там, где это необходимо, а не везде, где только можно вставить.
ConfigureAwait нужен для сохранения контекста выполнения, это может быть необязательно поток выполнения UI, нужно ли это в вашем конкретном случае? по моему, не нужно
...
Рейтинг: 0 / 0
29.02.2016, 07:57
    #39181054
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Task.ConfigureAwait объясните.
Roman Mejtesиспользовать надо там, где это необходимо, а не везде, где только можно вставить.Использовать ConfigureAwait(false) надо везде, где не требуется продолжение через контекст синхронизации. Другое дело, что его тупо лень писать там, где экономия на контексте синхронизации == экономии "на спичках".
...
Рейтинг: 0 / 0
29.02.2016, 15:23
    #39181513
Ilya81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Task.ConfigureAwait объясните.
Здесь я вообще не понимаю, какой в нём смысл, ведь кода за оператором await нет (или почти нет). А следующая по стеку функция определяет всё по своему ConfigureAwait. Так что здесь в нём смысла не вижу.
...
Рейтинг: 0 / 0
02.03.2016, 01:08
    #39183151
Awaiter
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Task.ConfigureAwait объясните.
Ilya81,

Мне кажется что если не указать ConfigureAwait в каком-то месте, то именно это место и "зацепит контекст" - что и приведет к проблемам.

Таким образом, как я понимаю, ConfigureAwait обязан быть на каждом шаге алгоритма. Везде ! Упустите хоть один шаг, и он станет слабым звеном.

Я это так понимаю.
...
Рейтинг: 0 / 0
04.03.2016, 13:05
    #39185868
Ilya81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Task.ConfigureAwait объясните.
AwaiterIlya81,

Мне кажется что если не указать ConfigureAwait в каком-то месте, то именно это место и "зацепит контекст" - что и приведет к проблемам.

Таким образом, как я понимаю, ConfigureAwait обязан быть на каждом шаге алгоритма. Везде ! Упустите хоть один шаг, и он станет слабым звеном.

Я это так понимаю.

Ну если только для защиты от неправильного использования, которое приводит к deadlock (когда поток контекста начинает ждать своего ж завершения). В это случае ConfigureAwait везде может помочь.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Task.ConfigureAwait объясните. / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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