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

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

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

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

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

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

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

судя по всему речь идет о Лабораторные по Reactive Extensions, в первый раз слышу, качаю, посмотрю.........
...
Рейтинг: 0 / 0
23.09.2010, 10:56
    #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
23.09.2010, 11:01
    #36861756
karapetyan_a
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каково типичное решение проблем асинхронного вызова?
Вестник,

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

более поздний запрос 2 будет потерян
...
Рейтинг: 0 / 0
23.09.2010, 11:32
    #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
23.09.2010, 11:36
    #36861885
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каково типичное решение проблем асинхронного вызова?
Вестниктогда возможна проблема "потерянного обновления".
во временной оси:
запрос 1
запрос 2
запрос 2 завершился, обновил запись №14
запрос 1 завершился, обновил запись №14

более поздний запрос 2 будет потерянМаловероятно, если речь идёт о редактировании текущей записи в форме редактирования или ещё где. А использование timestamp-а записи при сохранении в БД оградит от нарушения целостности, даже если это каким-то чудом произойдёт.
...
Рейтинг: 0 / 0
23.09.2010, 11:39
    #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
23.09.2010, 11:40
    #36861908
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каково типичное решение проблем асинхронного вызова?
Невнимательно прочитал, сори :-)

Но всё равно маловероятно. :-)
...
Рейтинг: 0 / 0
23.09.2010, 12:38
    #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
23.09.2010, 12:59
    #36862106
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каково типичное решение проблем асинхронного вызова?
ВестникНеужели сеттер свойства CurrPerson может быть вызван не из гуйного потока?
...
Рейтинг: 0 / 0
23.09.2010, 13:02
    #36862121
Вестник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каково типичное решение проблем асинхронного вызова?
нужно запретить его изменение пользователем во время того, как сервис начал обновлять данные
...
Рейтинг: 0 / 0
23.09.2010, 13:08
    #36862145
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каково типичное решение проблем асинхронного вызова?
Вестникнужно запретить его изменение пользователем во время того, как сервис начал обновлять данныеСобытие XXXCompleted выполняется в гуйном потоке, если речь идёт о типовом силверлайтном клиенте.
...
Рейтинг: 0 / 0
23.09.2010, 13:15
    #36862173
Вестник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каково типичное решение проблем асинхронного вызова?
коллега, с вами приятно общаться, но предлагаю ТС самому дальше поработать над своим приложением. пусть сам думает, халявные решения отучают думать самостоятельно
...
Рейтинг: 0 / 0
23.09.2010, 13:18
    #36862182
karapetyan_a
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каково типичное решение проблем асинхронного вызова?
Вестникколлега, с вами приятно общаться, но предлагаю ТС самому дальше поработать над своим приложением. пусть сам думает, халявные решения отучают думать самостоятельно

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

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

P.S. Вестник, расскажите, какое Вы хотите сделать разделение конкурентного доступа в текущем потоке? :)
...
Рейтинг: 0 / 0
23.09.2010, 13:31
    #36862238
Вестник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каково типичное решение проблем асинхронного вызова?
ниоткуда не следует, что речь идет о SL и также ниоткуда не следует, что приложение у клиента принципиально однопоточное. кроме того, даже в однопоточном асинхронном приложении запросто возникает проблема "потерянного обновления"
...
Рейтинг: 0 / 0
23.09.2010, 14:03
    #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
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Каково типичное решение проблем асинхронного вызова? / 25 сообщений из 28, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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