Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Что почитать чтобы научится программировать в асинхронной манере. / 25 сообщений из 70, страница 1 из 3
27.12.2010, 21:17
    #37037874
Denis.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что почитать чтобы научится программировать в асинхронной манере.
Начал разрабатывать приложение для сильвера - столкнулся со сложностями асинхронного взаимодействия с сервером. Что почитать по этому поводу чтобы начать эффективно разрабатывать в асинхронной модели взаимодействия с сервером
...
Рейтинг: 0 / 0
27.12.2010, 22:04
    #37037947
Что почитать чтобы научится программировать в асинхронной манере.
Denis.,

извиняюсь за оффтоп, но... а в чем конкретно сложности-то? даже в дремучем WinApi полно функций, которые принимают указатель на callback, и только в ём (коллбэке) и можно что-то делать с результатом выполнения функции... столь любимый ajax сегодня (хоть в виде jquery, хоть как) - та же самая архивная... вещь. Просто считай, что тебя известят о результатах... потом... в другом потоке... делов-то?
...
Рейтинг: 0 / 0
27.12.2010, 22:09
    #37037952
Denis.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что почитать чтобы научится программировать в асинхронной манере.
злостный оффтопDenis.,

извиняюсь за оффтоп, но... а в чем конкретно сложности-то? даже в дремучем WinApi полно функций, которые принимают указатель на callback, и только в ём (коллбэке) и можно что-то делать с результатом выполнения функции... столь любимый ajax сегодня (хоть в виде jquery, хоть как) - та же самая архивная... вещь. Просто считай, что тебя известят о результатах... потом... в другом потоке... делов-то?
Почему оффтоп. Это не оффтоп.
Сложность вот в чем:
Например я заполняю список неких айтемов, берущихся с сервера. На колбек вешаю заполнение списка и все ок. Затем мне от сервера опять нужен этот список, но чтобы заполнить не первый листбокс, а например другой. Как в колбеке я пойму какой лист заполнять? Я понимаю что есть множество решений, но стройного что то я не соображу. А хочется прочитать про типичный паттерн как это делается.
...
Рейтинг: 0 / 0
27.12.2010, 22:20
    #37037965
__ЛП
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что почитать чтобы научится программировать в асинхронной манере.
Denis.А хочется прочитать про типичный паттерн как это делается.
Паттерн называется Observer
Велосипед называется Rx
...
Рейтинг: 0 / 0
27.12.2010, 22:37
    #37037987
Denis.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что почитать чтобы научится программировать в асинхронной манере.
__ЛПDenis.А хочется прочитать про типичный паттерн как это делается.
Паттерн называется Observer
Велосипед называется Rx
Причем тут обзервер?
Про rx почитаю, спасибо.
...
Рейтинг: 0 / 0
27.12.2010, 22:47
    #37038000
__ЛП
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что почитать чтобы научится программировать в асинхронной манере.
Denis.Причем тут обзервер?
Именно при том.

Denis.Про rx почитаю, спасибо.
Да не за что.
...
Рейтинг: 0 / 0
28.12.2010, 00:19
    #37038068
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что почитать чтобы научится программировать в асинхронной манере.
Я вообще не понял проблемы. Предположим у нас в ViewModel есть

Код: plaintext
public ObservableCollection<T> Items => INotifyPropertyChanged

В асинхронном методе получения данных с сервера просто читаем ответ (e.Result) и пишем в эту коллекцию (Items), которая биндится в самом представлении (хоть декларативно, хоть в code behind).

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public void Foo()
{
    var svc = ServiceUtility.GetClient();
    svc.GetCategoriesCompleted += delegate(object sender, GetCategoriesCompletedEventArgs e)
    {
        if (e.Error != null)
        {
            throw new System.Exception(e.Error.Message);
        }
        this.Items = e.Result;
     };
     svc.GetCategoriesAsync();
     svc.CloseAsync();
}

Если нужно несколько вызовов сервиса + результаты в отдельные модели (или тупо кастом проперти в ViewModel), ради бога - оформляем свои Items1, Items2, ..., ItemsN и работаем с ними. В чём вопрос-то?
...
Рейтинг: 0 / 0
28.12.2010, 00:31
    #37038078
Denis.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что почитать чтобы научится программировать в асинхронной манере.
МСУ,

Вопрос как раз в "Если нужно несколько вызовов сервиса + результаты в отдельные модели (или тупо кастом проперти в ViewModel), ради бога - оформляем свои Items1, Items2, ..., ItemsN и работаем с ними"
Возьмем пример: есть набор неких айтемов. Я загрузил приложение, дернул с сервера этот набор, он отобразился в листе.
Затем, например, я нажимаю некую кнопку, которая должна мне мессаджбоксом показать кол-во айтемов(на серввере), не обновив листбок прежде заполненный. Как это правильно делается?
...
Рейтинг: 0 / 0
28.12.2010, 00:44
    #37038090
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что почитать чтобы научится программировать в асинхронной манере.
Denis.Как это правильно делается?
Я же уже сказал - во вьюмодели.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
public void GetCategories()
{
    this.Items = e.Result;
}

public void GetCategoriesCount()
{
    /// ...
    this.Count = e.Result;
}

А в представлении с этими данными (Items и Count) можете что угодно делать.

P.S. Почитайте про паттерны MVVM или MVC (MVP).
...
Рейтинг: 0 / 0
28.12.2010, 00:53
    #37038102
Denis.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что почитать чтобы научится программировать в асинхронной манере.
МСУDenis.Как это правильно делается?
Я же уже сказал - во вьюмодели.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
public void GetCategories()
{
    this.Items = e.Result;
}

public void GetCategoriesCount()
{
    /// ...
    this.Count = e.Result;
}

А в представлении с этими данными (Items и Count) можете что угодно делать.

P.S. Почитайте про паттерны MVVM или MVC (MVP).
Про MVC и MVP я, конечно, в курсе. Про mvvm - представляю что это такое. тем не менее все же непонятно 2 момента:
мне на "каждый вызов" удаленного метода создавать член класса?
Как в удобочитаемой манере заюзать, в данном случае, Count, без синка потоков? Нечто вроде:
Код: plaintext
1.
2.
3.
4.
5.
void Foo()
{
 if(serviceProxy.GetItemsCount()==0)
 ...
}
ЗЫ. Я понимаю различные варианты решения проблемы. Просто не нахожу ни один из них тривиальным(что часто == правильным)
...
Рейтинг: 0 / 0
28.12.2010, 00:59
    #37038112
Denis.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что почитать чтобы научится программировать в асинхронной манере.
вообще мне непонятно почему убрана синхронная модель :-(
...
Рейтинг: 0 / 0
28.12.2010, 01:00
    #37038114
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что почитать чтобы научится программировать в асинхронной манере.
Denis.Про mvvm - представляю что это такое.
Не представляете.

Denis.мне на "каждый вызов" удаленного метода создавать член класса?
Это Вы уже сами решайте, но ViewModel "должна быть в курсе", что Вы там дёрнули и что оно там вернулось, чтобы известить об этом представление.

Denis.без синка потоков?
Их не нужно синхронизировать, у нас полноценная асинхронная обёртка. Никаких костылей не нужно, всё, как Вы выразились, тривиально. Уже обсуждали про "синхронность SL".
...
Рейтинг: 0 / 0
28.12.2010, 01:02
    #37038117
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что почитать чтобы научится программировать в асинхронной манере.
Denis.вообще мне непонятно почему убрана синхронная модель :-(
Читать от сюда: 9899156
...
Рейтинг: 0 / 0
28.12.2010, 01:02
    #37038118
Denis.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что почитать чтобы научится программировать в асинхронной манере.
МСУDenis.Про mvvm - представляю что это такое.
Не представляете.

Denis.мне на "каждый вызов" удаленного метода создавать член класса?
Это Вы уже сами решайте, но ViewModel "должна быть в курсе", что Вы там дёрнули и что оно там вернулось, чтобы известить об этом представление.

Denis.без синка потоков?
Их не нужно синхронизировать, у нас полноценная асинхронная обёртка. Никаких костылей не нужно, всё, как Вы выразились, тривиально. Уже обсуждали про "синхронность SL".
Это все здорово при биндинге вью на вьюмодель, но вот когда никакого биндинга нет, а вызов сервиса используется в БЛ фактически все становится не так стройно
...
Рейтинг: 0 / 0
28.12.2010, 01:06
    #37038120
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что почитать чтобы научится программировать в асинхронной манере.
Denis.Это все здорово при биндинге вью на вьюмодель, но вот когда никакого биндинга нет, а вызов сервиса используется в БЛ фактически все становится не так стройно

Код: plaintext
1.
2.
3.
private void OnCompleted(object sender, OnCompletedEventArgs e ) 
{     
    Dispatcher.BeginInvoke(() => // доступ к UI // ); 
}
...
Рейтинг: 0 / 0
28.12.2010, 01:11
    #37038125
Denis.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что почитать чтобы научится программировать в асинхронной манере.
МСУDenis.Это все здорово при биндинге вью на вьюмодель, но вот когда никакого биндинга нет, а вызов сервиса используется в БЛ фактически все становится не так стройно

Код: plaintext
1.
2.
3.
private void OnCompleted(object sender, OnCompletedEventArgs e ) 
{     
    Dispatcher.BeginInvoke(() => // доступ к UI // ); 
}


не, я не про то:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
void SomeMethod()
{
   if(serviceProxy.GetItemsCount()==0)
  { 
      viewModel.Items = serviceProxy.GetOtherItems();
      if(!serviceProxy.TryFillDefaultItems())
      {
          ....
      }
  }
}
...
Рейтинг: 0 / 0
28.12.2010, 01:16
    #37038131
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что почитать чтобы научится программировать в асинхронной манере.
Denis.не, я не про то:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
void SomeMethod()
{
   if(serviceProxy.GetItemsCount()==0)
  { 
      viewModel.Items = serviceProxy.GetOtherItems();
      if(!serviceProxy.TryFillDefaultItems())
      {
          ....
      }
  }
}


Чё за бред? :)
...
Рейтинг: 0 / 0
28.12.2010, 01:25
    #37038141
Denis.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что почитать чтобы научится программировать в асинхронной манере.
МСУ,

это не важно. Суть в том, как его переписать в асинхронной модели. Например !serviceProxy.TryFillDefaultItems(). Мне нужно вызвать асинхронный метод, в нем заполнить поле, созданное для него, в потоке текущего метода подождать коллбека и взять значение из члена.
...
Рейтинг: 0 / 0
28.12.2010, 01:32
    #37038148
i
i
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что почитать чтобы научится программировать в асинхронной манере.
Простыми lookup'ами лучше не засорять основной ViewModel. Для них можно создать отдельный Locator(конвертер или markup extenstions), который будет делать выборку из БД.
...
Рейтинг: 0 / 0
28.12.2010, 01:36
    #37038152
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что почитать чтобы научится программировать в асинхронной манере.
Denis.МСУ, это не важно.
Это важно. Во-первых, с точки зрения производительности, а во-вторых - нагрузки на сам сервер, где котором хостится сервис. Зачем дергать n-раз метод, если можно за один проход получить интересующую информацию. Будет возвращаться класс, содержащий в себе всю необходимую информацию для принятия дальнейшего решения.
...
Рейтинг: 0 / 0
28.12.2010, 02:30
    #37038175
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что почитать чтобы научится программировать в асинхронной манере.
Если уж надо раскидать по n-вызовам, то в чём проблема написать:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
var svc = ServiceUtility.GetClient();
svc.GetItemsCountCompleted += delegate(object service1, GetItemsCountCompletedEventArgs args1)
{
    if (args1.Result == 0)
    {
        var client = ServiceUtility.GetClient();
        client.GetItemsCountCompleted += delegate(object service2, GetItemsCountCompletedEventArgs args2)
        {
            // телодвижения
        };
        client.GetItemsCountAsync();
        client.CloseAsync();
    }
};
svc.GetItemsCountAsync();
svc.CloseAsync();
...
Рейтинг: 0 / 0
28.12.2010, 10:32
    #37038430
i
i
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что почитать чтобы научится программировать в асинхронной манере.
МСУЕсли уж надо раскидать по n-вызовам, то в чём проблема написать:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
var svc = ServiceUtility.GetClient();
svc.GetItemsCountCompleted += delegate(object service1, GetItemsCountCompletedEventArgs args1)
{
    if (args1.Result == 0)
    {
        var client = ServiceUtility.GetClient();
        client.GetItemsCountCompleted += delegate(object service2, GetItemsCountCompletedEventArgs args2)
        {
            // телодвижения
        };
        client.GetItemsCountAsync();
        client.CloseAsync();
    }
};
svc.GetItemsCountAsync();
svc.CloseAsync();


Не проблема, только лениво писать одно и тоже десятки раз
...
Рейтинг: 0 / 0
28.12.2010, 13:27
    #37038917
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что почитать чтобы научится программировать в асинхронной манере.
iНе проблема, только лениво писать одно и тоже десятки раз
Согласен. И я про то же.
...
Рейтинг: 0 / 0
28.12.2010, 17:18
    #37039490
qu-qu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что почитать чтобы научится программировать в асинхронной манере.
МСУiНе проблема, только лениво писать одно и тоже десятки раз
Согласен. И я про то же.
Ну, дык, для это же Rx и советовали, насколько я понимаю?
...
Рейтинг: 0 / 0
28.12.2010, 18:39
    #37039698
i
i
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что почитать чтобы научится программировать в асинхронной манере.
МСУiНе проблема, только лениво писать одно и тоже десятки раз
Согласен. И я про то же.

Тогда предлагай общие варианты, когда не нужно это писать сорок восем раз.
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Что почитать чтобы научится программировать в асинхронной манере. / 25 сообщений из 70, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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