Сообщение 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>Если мы не ожидаем завершения вызова DoSomething, состояние программы становится неопределенным. Лезут баги.
Ну вопервых не int, а Task<int>
во вторых мы прячем await в
В твоем случае прекрасно работает и без async
Другой вопрос, как ты дождешься выполнения Setterа? Ведь сеттер ничего не возвращает
Проще использовать асинхронный метод.
Или добавить Task свойству которому и присваивать
Task asynckprop
И вызов
Либо делать еще один тип свойства для задач. Только никому это особо то и не нужно.
Проще использовать асинхронные методы
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>Если мы не ожидаем завершения вызова DoSomething, состояние программы становится неопределенным. Лезут баги.
Ну вопервых не int, а Task<int>
во вторых мы прячем await в
В твоем случае прекрасно работает и без async
Другой вопрос, как ты дождешься выполнения Setterа? Ведь сеттер ничего не возвращает
Проще использовать асинхронный метод.
Или добавить Task свойству которому и присваивать
Task asynckprop
И вызов
Либо делать еще один тип свойства для задач. Только никому это особо то и не нужно.
Проще использовать асинхронные методы
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;Либо делать еще один тип свойства для задач. Только никому это особо то и не нужно.
Проще использовать асинхронные методы