Гость
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Как вызвать async/await код из OperationContract кода? / 6 сообщений из 6, страница 1 из 1
11.01.2016, 21:38
    #39144983
mabanza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вызвать async/await код из OperationContract кода?
Привет.
В WCF функции хочу вызвать обработчик асинхронно
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
 [OperationContract]
  public string GetWelcomeGreeting(bool IsUser, out string ErrorStr)
  {
       ErrorStr = "";
       string result = "";
        
        Proc0();

        return result;
  }

 private async Task<string> Proc0()
 {
            string result = "";
            Task task = new Task(() =>
            {
                string sql = String.Concat("select Content from WebWelcomeGreet where Mode=", true);
                result = dal.GetScalar(sql);
            });
            await task;
            return result;
 }



но задача task в Proc0() никогда не вызывается. В чем может быть проблема?
Спасибо.
...
Рейтинг: 0 / 0
12.01.2016, 02:16
    #39145056
Axeleron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вызвать async/await код из OperationContract кода?
...
Рейтинг: 0 / 0
18.01.2016, 18:54
    #39150024
ProBiotek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вызвать async/await код из OperationContract кода?
mabanza,

Во первых, вы не так работаете с асинхронностью - если уж говорить об async/await.

Попробуйте изменить так:
Код: c#
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.
[OperationContract]
  public async string GetWelcomeGreeting(bool IsUser, out string ErrorStr)
  {        
        string result = await Proc0();

        return result;
  }

 private async Task<string> Proc0()
 {
            Task <string> mytask = dalGetScalarAsync(sql);
            string result = await mytask;
            
/*
   это не правильный подход в принципе. 
   нужно избегать создания новых потоков (через таск), когда они не нужны.

            Task task = new Task(() =>
            {
                string sql = String.Concat("select Content from WebWelcomeGreet where Mode=", true);
                result = dal.GetScalar(sql);
            });*/

            return result;
 }



Разберитесь как работать с асинхронными методами в принципе. Могу порекомендовать пару книг.

Во вторых
На удаленный сервис можно натравить стандартную утилиту VS (Add Service Reference). Там по умолчанию уже включена галочка "генерировать для каждого метода асинхронные версии". Все сделает сама.
В результате чего получите клиента где будет каждый метод + асинхронная пара к нему.
Вызывайте эти асинхронные версии через async/await.
...
Рейтинг: 0 / 0
18.01.2016, 19:15
    #39150040
ProBiotek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вызвать async/await код из OperationContract кода?
Axeleron,

Подход, реализованный через IAsyncResult является устаревшим. Не стоит ориентироватся на эту ссылку.

Современным подходом (TAP. С применением Task, async/await) описывается тут
https://msdn.microsoft.com/ru-ru/library/hh873175(v=vs.110).aspx
...
Рейтинг: 0 / 0
18.01.2016, 20:03
    #39150080
Axeleron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вызвать async/await код из OperationContract кода?
ProBiotek,
WCF подход также прошу считать устаревшим тогда. Уже давно в моде RESTful
...
Рейтинг: 0 / 0
18.01.2016, 20:35
    #39150106
ProBiotek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вызвать async/await код из OperationContract кода?
Axeleron,

Я не хочу сказать, что применение IAsyncResult запрещено. Это официально устаревший подход. Рекомендуемым является TAP.
Тем более mabanza просил именно про async/await/Task подход.

Так, что уж если изучать - то лучше изучать официально последние рекомендации, чтобы не переучиваться, или не сидеть на устаревших подходах.
...
Рейтинг: 0 / 0
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Как вызвать async/await код из OperationContract кода? / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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