Информация об изменениях

Сообщение Re[5]: Почему свойства C# не могут быть асинхронными? от 24.05.2023 8:56

Изменено 24.05.2023 9:54 Serginio1

Re[5]: Почему свойства C# не могут быть асинхронными?
Здравствуйте, 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;



Либо делать еще один тип свойства для задач. Только никому это особо то и не нужно.
Проще использовать асинхронные методы
Re[5]: Почему свойства C# не могут быть асинхронными?
Здравствуйте, 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;



Либо делать еще один тип свойства для задач. Только никому это особо то и не нужно.
Проще использовать асинхронные методы