powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Каково типичное решение проблем асинхронного вызова?
28 сообщений из 28, показаны все 2 страниц
Каково типичное решение проблем асинхронного вызова?
    #36861647
karapetyan_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть список людей отображаемый в гриде, при выделении человека, он становится «текущим» и для «текущего» вызывается фунцкия сервиса GetDetailAsync(PersonId) запрашивающая детали человека, по завершении вызывается GetDetailAsyncCompleted() где полученные детали присваиваются «текущему» человеку...........
проблема в том, что «текущий» уже может быть другой человек, т.к. юзер переместился на другую строчку грида..........

1 вариант решения такой: не давать пользователю менять «текущего» человека.......... но тогда где «асинхронное» программирование?

Другие варианты/предложения?

С уважением, Ашот.

p.s. посылать подальше не спешите, сам дорогу знаю, мсдн, рсдн... просто хочется узнать как народ обычно выкручивается из подобных ситуаций, просто на словах.
...
Рейтинг: 0 / 0
Каково типичное решение проблем асинхронного вызова?
    #36861656
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
karapetyan_a,

не надо выкручиваться.
нужно просто принять данные от первого асинхрона и не отображать их.
а данные от второго(который на данный момент станет текущим) отобразить.
...
Рейтинг: 0 / 0
Каково типичное решение проблем асинхронного вызова?
    #36861682
karapetyan_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeiKkarapetyan_a,
не надо выкручиваться.
нужно просто принять данные от первого асинхрона и не отображать их.
а данные от второго(который на данный момент станет текущим) отобразить.

GetDetailAsyncCompleted() не знает он вызван для первого или для второго........
Хотя........ чуток слукавил, конкретно в моем случае по возвращаемым значениям можно понять для кого он вызван. но "это частность, которая к общему делу не отноститься" :)
...
Рейтинг: 0 / 0
Каково типичное решение проблем асинхронного вызова?
    #36861697
i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
i
Гость
Скачай лабораторные работы по Rx, посмотри, как с помощью оператора Switch решается подобная проблема для AutoCompleteBox
...
Рейтинг: 0 / 0
Каково типичное решение проблем асинхронного вызова?
    #36861725
karapetyan_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iСкачай лабораторные работы по Rx, посмотри, как с помощью оператора Switch решается подобная проблема для AutoCompleteBox

судя по всему речь идет о Лабораторные по Reactive Extensions, в первый раз слышу, качаю, посмотрю.........
...
Рейтинг: 0 / 0
Каково типичное решение проблем асинхронного вызова?
    #36861734
Вестник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторэто частность, которая к общему делу не отноститься
эта частность неплохо обобщается:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Context.CurrentParameters

GetAsyncsData(Parameters, Context)
{
    Service.GetDataAsync();
    Service.Completed += () => 
        { 
            if (Context.CurrentParamers == Parameters)
            {
                Process();
            }
            // неплохо бы отписаться, но для этого нужно уйти от лямбды
        }
}
...
Рейтинг: 0 / 0
Каково типичное решение проблем асинхронного вызова?
    #36861756
karapetyan_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вестник,

Убедил, спасибо.
...
Рейтинг: 0 / 0
Каково типичное решение проблем асинхронного вызова?
    #36861765
Вестник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не забудьте lock(Context.CurrentParameters)
...
Рейтинг: 0 / 0
Каково типичное решение проблем асинхронного вызова?
    #36861781
karapetyan_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вестник,
Врать не буду........ про оператор lock увидел/узнал вчера (раньше не сталкивался с многопоточностью), чуток почитал, но "досконально" не разобрался... видимо надо докопать до конца :)
...
Рейтинг: 0 / 0
Каково типичное решение проблем асинхронного вызова?
    #36861806
Вестник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
иначе во время Process() у вас изменится CurrentParameter и вы опять столкнетесь с той же самой проблемой
...
Рейтинг: 0 / 0
Каково типичное решение проблем асинхронного вызова?
    #36861847
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может лучше делать поиск сущности в списке по ключевому полю и заменять её вновь полученной? Тогда пофиг какая запись текущая.
...
Рейтинг: 0 / 0
Каково типичное решение проблем асинхронного вызова?
    #36861857
Вестник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тогда возможна проблема "потерянного обновления".
во временной оси:
запрос 1
запрос 2
запрос 2 завершился, обновил запись №14
запрос 1 завершился, обновил запись №14

более поздний запрос 2 будет потерян
...
Рейтинг: 0 / 0
Каково типичное решение проблем асинхронного вызова?
    #36861864
karapetyan_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вестникне забудьте lock(Context.CurrentParameters)

Если не трудно, вставте сюда lock(??)
Код: 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.
    public class SqlRuSample
    {
        private Person _currPerson;
        public Person CurrPerson
        {
            get { return this._currPerson; }
            set
            { 
                if(this._currPerson != value)
                {
                    this._currPerson = value; // при изменении текущего человека
                    this.GetDetail(); // вызываю заполнение деталей
                }
            }
        }

        void GetDetail()
        {
            PersonServiceClient c = new PersonServiceClient();
            c.GetPersonDetaiCompleted += new EventHandler<GetPersonDetaiCompletedEventArgs>(c_GetPersonDetaiCompleted);
            c.GetPersonDetailAsync(this._currPerson.Id);
        }

        void c_GetPersonDetaiCompleted(object sender, GetPersonDetaiCompletedEventArgs e)
        {
            this._currPerson.EMail = e.Result;
        }
    }
...
Рейтинг: 0 / 0
Каково типичное решение проблем асинхронного вызова?
    #36861885
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вестниктогда возможна проблема "потерянного обновления".
во временной оси:
запрос 1
запрос 2
запрос 2 завершился, обновил запись №14
запрос 1 завершился, обновил запись №14

более поздний запрос 2 будет потерянМаловероятно, если речь идёт о редактировании текущей записи в форме редактирования или ещё где. А использование timestamp-а записи при сохранении в БД оградит от нарушения целостности, даже если это каким-то чудом произойдёт.
...
Рейтинг: 0 / 0
Каково типичное решение проблем асинхронного вызова?
    #36861902
karapetyan_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМожет лучше делать поиск сущности в списке по ключевому полю и заменять её вновь полученной? Тогда пофиг какая запись текущая.
Правильно ли я понял:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
// при изменении текущего человека вызывать
GetDetail(Person 1)
GetDetail(Person 2)
...
GetDetail(Person n)
..

GetDetailCompleted(e)
{
PersonDetail pd = e.Result;
Person p = this.MyPersonCollection.FindById(pd.parentId);
p.Detail = pd;
// вместо CurrentPerson.Detail = e.Result;
}
...
Рейтинг: 0 / 0
Каково типичное решение проблем асинхронного вызова?
    #36861908
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Невнимательно прочитал, сори :-)

Но всё равно маловероятно. :-)
...
Рейтинг: 0 / 0
Каково типичное решение проблем асинхронного вызова?
    #36862084
Вестник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
karapetyan_aЕсли не трудно, вставте сюда lock(??)

не то, чтобы трудно, но у вас в одном классе, модель не отделена ни от сервиса, ни от текущего контекста, что не есть правильно

если очень хочется, то, первый lock

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public Person CurrPerson
        {
            get { return this._currPerson; }
            set
            { 
                lock(this._currPerson)
                {
                    if(this._currPerson != value)
                    {
                        this._currPerson = value; // при изменении текущего человека
                        this.GetDetail(); // вызываю заполнение деталей
                    }
                }
            }
        }
второй lock:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
void c_GetPersonDetaiCompleted(object sender, GetPersonDetaiCompletedEventArgs e)
        {
            lock(this._currPerson)
            {
                  if (id не изменился)
                  {
                       this._currPerson.EMail = e.Result;
                  }
            }
        }
...
Рейтинг: 0 / 0
Каково типичное решение проблем асинхронного вызова?
    #36862106
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВестникНеужели сеттер свойства CurrPerson может быть вызван не из гуйного потока?
...
Рейтинг: 0 / 0
Каково типичное решение проблем асинхронного вызова?
    #36862121
Вестник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нужно запретить его изменение пользователем во время того, как сервис начал обновлять данные
...
Рейтинг: 0 / 0
Каково типичное решение проблем асинхронного вызова?
    #36862145
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вестникнужно запретить его изменение пользователем во время того, как сервис начал обновлять данныеСобытие XXXCompleted выполняется в гуйном потоке, если речь идёт о типовом силверлайтном клиенте.
...
Рейтинг: 0 / 0
Каково типичное решение проблем асинхронного вызова?
    #36862173
Вестник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
коллега, с вами приятно общаться, но предлагаю ТС самому дальше поработать над своим приложением. пусть сам думает, халявные решения отучают думать самостоятельно
...
Рейтинг: 0 / 0
Каково типичное решение проблем асинхронного вызова?
    #36862182
karapetyan_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вестникколлега, с вами приятно общаться, но предлагаю ТС самому дальше поработать над своим приложением. пусть сам думает, халявные решения отучают думать самостоятельно

Тем и занят, спасибо всем.
...
Рейтинг: 0 / 0
Каково типичное решение проблем асинхронного вызова?
    #36862220
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КВестникнужно запретить его изменение пользователем во время того, как сервис начал обновлять данныеСобытие XXXCompleted выполняется в гуйном потоке, если речь идёт о типовом силверлайтном клиенте.

Лёня, я тоже чёта не понял, о каком локе Вестник вещает.

P.S. Вестник, расскажите, какое Вы хотите сделать разделение конкурентного доступа в текущем потоке? :)
...
Рейтинг: 0 / 0
Каково типичное решение проблем асинхронного вызова?
    #36862238
Вестник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ниоткуда не следует, что речь идет о SL и также ниоткуда не следует, что приложение у клиента принципиально однопоточное. кроме того, даже в однопоточном асинхронном приложении запросто возникает проблема "потерянного обновления"
...
Рейтинг: 0 / 0
Каково типичное решение проблем асинхронного вызова?
    #36862378
karapetyan_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вестникниоткуда не следует, что речь идет о SL
Да речь идет именно о Siverlight.....
Честно говоря, ента асинхронность поставила под сомнение всю мою архитектуру...
Идея была такая
1. Есть набор классов/сущностей (Model)которые реализуют INotifyPropertyChanged
Есть так-же класс содержащий в себе все сущности в виде свойств (CurrentPerson, CurrentUser, People(collection)
Который тоже генерит PropertyChanged...
2. Есть контролы (View) которые биндятся к свойствам MyData.CurrentPerson, MyData.CurrentUser и отображают их.
3. Есть контроллер(Controller), в котором реализована вся функциональность по доступу к сервисам, и который в свою очередь слушает события PropertyChanged у MyData.

к примеру если меняется (инициатор изменения юзер, то бишь с интерфейса) CurrentPerson то надо подгрузить детали сего Person-а, а дело View просто эти детали отобразить.

Но получается, что если юзер нервно меняет текущего Person-а, контроллер не знает чьи детали пришли (в XXXcompleted методе... )

Вот, перечитал......... какая была идея......... :(
...
Рейтинг: 0 / 0
Каково типичное решение проблем асинхронного вызова?
    #36863270
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
karapetyan_aНо получается, что если юзер нервно меняет текущего Person-а, контроллер не знает чьи детали пришли (в XXXcompleted методе... )Сказали же, что в обработчике XXXCompleted поставить проверку - если текущая запись изменена, то ничего не делать. Главное чтобы в модели детализации была информация к чему она относится.

ЗЫ: lock можно не делать, поскольку всё происходит в одном потоке.
...
Рейтинг: 0 / 0
Каково типичное решение проблем асинхронного вызова?
    #36865864
karapetyan_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вобщем свою проблему решил, если кому интересно:
при вызове метода XXXAsync(smt.) можно вторым параметром передать сам объект Person, для которого и запрашиваются детали
а в методе XXXCompleted получить ссылку на Person, чьи маилы пришли через свойство e.UserState.

Всем спасибо.
...
Рейтинг: 0 / 0
Каково типичное решение проблем асинхронного вызова?
    #36865903
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
karapetyan_a,

а нафига "передать сам объект"? гораздо надежней проверить соответствующий ID, imho
...
Рейтинг: 0 / 0
28 сообщений из 28, показаны все 2 страниц
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Каково типичное решение проблем асинхронного вызова?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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