Re: Почему свойства C# не могут быть асинхронными?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 22.05.23 16:07
Оценка:
Здравствуйте, vaa, Вы писали:

vaa>Или могут? Или нельзя, но иногда можно?


Кстати
А так
   public Task<int> AsyncProp
        {
            get { return Task<int>.Run(async () =>  await Task.FromResult(1)); }

        }
и солнце б утром не вставало, когда бы не было меня
Re[2]: Почему свойства C# не могут быть асинхронными?
От: vaa  
Дата: 23.05.23 13:09
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>Здравствуйте, vaa, Вы писали:


vaa>>Или могут? Или нельзя, но иногда можно?


S>Кстати

S>А так
S>
S>   public Task<int> AsyncProp
S>        {
S>            get { return Task<int>.Run(async () =>  await Task.FromResult(1)); }

S>        }
S>


а как вернуть управление из асинка в сеттер? эвэйт запрещен. остается только wait но он вроде блокировать поток.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[3]: Почему свойства C# не могут быть асинхронными?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 23.05.23 15:21
Оценка:
Здравствуйте, vaa, Вы писали:


vaa>>>Или могут? Или нельзя, но иногда можно?


S>>Кстати

S>>А так
S>>
S>>   public Task<int> AsyncProp
S>>        {
S>>            get { return Task<int>.Run(async () =>  await Task.FromResult(1)); }

S>>        }
S>>


vaa>а как вернуть управление из асинка в сеттер? эвэйт запрещен. остается только wait но он вроде блокировать поток.

Поему запрещен?

Как обычно. Возвращается Task

То есть

var result= await AsyncProp;
и солнце б утром не вставало, когда бы не было меня
Отредактировано 23.05.2023 15:22 Serginio1 . Предыдущая версия .
Re[4]: Почему свойства C# не могут быть асинхронными?
От: vaa  
Дата: 24.05.23 01:39
Оценка: +1
Здравствуйте, Serginio1, Вы писали:

vaa>>а как вернуть управление из асинка в сеттер? эвэйт запрещен. остается только wait но он вроде блокировать поток.

S>Поему запрещен?
я говорю об асинхронном вызове внутри сеттера
public class Date
{
    private int _month = 7;  // Backing store

    public int Month
    {
        get => _month;
        set
        {
                _month = value;
        await DoSomething();
        }
    }
}

Если мы не ожидаем завершения вызова DoSomething, состояние программы становится неопределенным. Лезут баги.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[5]: Почему свойства C# не могут быть асинхронными?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 24.05.23 08:56
Оценка: 4 (1)
Здравствуйте, vaa, Вы писали:

vaa>Здравствуйте, Serginio1, Вы писали:


vaa>>>а как вернуть управление из асинка в сеттер? эвэйт запрещен. остается только wait но он вроде блокировать поток.

S>>Поему запрещен?
vaa>я говорю об асинхронном вызове внутри сеттера
vaa>
vaa>public class Date
vaa>{
vaa>    private int _month = 7;  // Backing store

vaa>    public int Month
vaa>    {
vaa>        get => _month;
vaa>        set
vaa>        {
vaa>                _month = value;
vaa>        await DoSomething();
vaa>        }
vaa>    }
vaa>}
vaa>

vaa>Если мы не ожидаем завершения вызова DoSomething, состояние программы становится неопределенным. Лезут баги.

Ну вопервых не int, а Task<int>
во вторых мы прячем await в
Task<int>.Run(async () =>  await Task.FromResult(1))



   public Task<int> AsyncProp
        {
            get { return Task<int>.Run(async () =>  await Task.FromResult(1)); }

        }


В твоем случае прекрасно работает и без async
 public class Date
    {
        private int _month = 7;  // Backing store

        public Task<int> Month
        {
            get => Task.FromResult(_month);
            set
            {

                Task.Run(async () =>
                {
                    _month = await value;
                     await DoSomething();
                });
            }
        }
    }


Другой вопрос, как ты дождешься выполнения Setterа? Ведь сеттер ничего не возвращает
Проще использовать асинхронный метод.

Или добавить Task свойству которому и присваивать

Task asynckprop
 public static Task AsyncProp
    {
        get =>asynckprop;

    }

set
            {

                asynckprop=Task.Run(async () =>
                {
                    _month = await value;
                     await DoSomething();
                });
            }


И вызов

 date.Month=Task.FromResult(_month);
 await date.AsyncProp;



Либо делать еще один тип свойства для задач. Только никому это особо то и не нужно.
Проще использовать асинхронные методы
и солнце б утром не вставало, когда бы не было меня
Отредактировано 24.05.2023 9:54 Serginio1 . Предыдущая версия . Еще …
Отредактировано 24.05.2023 9:06 Serginio1 . Предыдущая версия .
Отредактировано 24.05.2023 8:58 Serginio1 . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.