2015-10-20 3 views
-6

Привет я следующий метод в моем # веб-службы C:Как конвертировать метод ASync/ждут C#

[WebMethod(EnableSession = true)] 
     //[ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)] 
     public object[] GetChartData() 
     { 

      System.Threading.Thread.Sleep(5000); 

      string graphData = ""; 

      List<GoogleChartData> data = new List<GoogleChartData>(); 

      using (DBContext context = new DBContext()) 
      { 
       data = context.Campaings.AsNoTracking().Take(10).Select(c => new GoogleChartData 
       { 
        Year = 2015, 
        USA = 1, 
        Mexico = 2, 
        Canada = 3 
       }).ToList(); 
      } 

      var chartData = new object[data.Count + 1]; 
      chartData[0] = new object[]{ 
       "Year", 
       "USA", 
       "Mexico", 
       "Canada" 
      }; 

      Random random = new Random(); 

      int j = 0; 
      foreach (var i in data) 
      { 


       j++; 
       chartData[j] = new object[] { i.Year.ToString(), random.Next(0, 1000), random.Next(0, 1000), random.Next(0, 1000) }; 
      } 
      return chartData; 

     } 

У меня возникли проблемы при вызове из одного приложения несколько раз, так что я хочу, чтобы это сделать асинхронный. Im новое для Async/Await.

Любые подсказки?

+5

У меня возникли проблемы с выяснить, какие проблемы у вас есть ... Вы можете посмотреть на некоторые асинхронном/ждут образцы первых в рамках вы используете (внешний вид как WebForms). –

+2

Учитывая природу веб-разработки, 'async/await' вряд ли поможет вам здесь. Возможно, вы должны быть более конкретными в отношении того, с какими проблемами вы сталкиваетесь? – BradleyDotNET

+2

Почему у вашей программы есть 5-секундный сон внутри? и какие «проблемы» вы имеете, когда вы вызываете метод несколько раз. EDIT: у вас есть много вещей, которые не имеют смысла, вы делаете '.Select (c =>', но вы никогда не используете 'c' внутри select, почему вы вообще делаете вызов базы данных? –

ответ

-1

Я не совсем ясно, о том, что вы хотите, но если вы хотите использовать Await/Async в вашей функции, вот ваш ключ (предположим, что вы используете Entity Framework 6):

public async Task<object[]> GetChartData() 
{ 
    List<GoogleChartData> data; 
    using (DBContext context = new DBContext()) 
    { 
     data = await context.Campaings.AsNoTracking().Take(10).Select(c => new GoogleChartData 
     { 
      Year = 2015, 
      USA = 1, 
      Mexico = 2, 
      Canada = 3 
     }).ToListAsync(); // Use ToListAsync() 
    } 

    // The rest are the same 
} 

EDIT !!!

VAAA в комментарии, ToListAsync() не доступен в его ситуации, поэтому я пытаюсь найти другое решение.

С помощью идеи Scott Chamberlain в его комментарии, решениетора: using Task.Run(() => GetChartData()) от вызывающего.

Для тех, кто намерен использовать Task.Run() внутри GetChartData(): мы должны НЕmake asynchronous wrappers for synchronous code.

+0

Предположим, что у меня нет ToListAsync(), как я могу преобразовать его в async – VAAA

+1

@VAAA Вам нужно найти асинхронную версию любого метода из любой библиотеки, которую вы используете. Если нет асинхронного метода, вы, скорее всего, поправитесь производительность, не делая ее асинхронной. –

+2

@AnhTriet Выполнение 'Task.Run' внутри функции« для ее асинхронности »почти никогда не рекомендуется делать, гораздо лучше выбрать, чтобы вызывающий вызывал« Task.Run (() => GetChartData()) ', и у вас есть Task.Run вызывающего, который хочет, чтобы он работал в фоновом потоке. Вы должны [не создавать асинхронные обертки для синхронного кода] (http://blogs.msdn.com/b/pfxteam/archive/2012/03/24/10287244.aspx). –

-3

Посмотрите Creating an async webservice method

[WemMethod] 
public async Task<List<ErrorLog>> GetAllErrorLogs() 
{ 
List<ErrorLog> errorLogs = new List<ErrorLog>(); 
await System.Threading.Tasks.Task.Run(() => { 
    errorLogs = ErrorLogRepository.GetAllErrorLogs(); 
}) 
if (errorLogs == null) 
    return new List<ErrorLog>(); 
return errorLogs; 
} 
+2

Выполнение того, что вы делали, ничего не делает, кроме увеличения накладных расходов на сервере, создавая новый поток. Единственное, что вы сделали, это сделать вашу программу медленнее.Если вы выполняете «Task.Run» в проекте IIS, вы, вероятно, делаете что-то неправильно. –

Смежные вопросы