2017-02-16 13 views
0

У меня есть сервер, который должен опросить оборудование через сеть, чтобы получить информацию, обработать ее и затем отправить ее пользователям. Обследование оборудования становится синхронной функцией блокировки.Оберните синхронную функцию при асинхронном вызове C#

Моего вопроса:

Как создать собственную функцию асинхронной версию для выполнения этой функции с использованием задачи или другую асинхронной модели ???

Рассмотрим следующий код, чтобы получить информацию от оборудования:

IEnumerable<Logs> GetDataFromEquipment(string ipAddress) 
     { 
      Equipment equipment = new Equipment(); 
      //Open communication with equipment. Blocking code. 
      int handler = equipment.OpenCommunication(ipAddress); 
      //get data from equipment. Blocking code. 
      IEnumerable<Logs> logs = equipment.GetLogs(handler); 
      //close communication with equipment 
      equipment.CloseCommunication(handler); 

      return logs; 
     } 

Благодарности

+1

Вы делаете 'GetLogs' асинхронный первый. – Servy

+0

как я могу это сделать ... –

+0

вы должны сделать свои IO-методы асинхронными. post Метод OpenCommunication, например. , и я покажу вам, как это сделать. Какова ваша коммуникация? какой .net объект/класс? –

ответ

1

Вы можете использовать асинхронной/ОЖИДАНИЕ

public async Task<IEnumerable<Logs>> GetDataFromEquipment(string ipAddress) 
    { 

     var task = Task.Run(() => 
     { 
      Equipment equipment = new Equipment(); 
      //Open communication with equipment. Blocking code. 
      int handler = equipment.OpenCommunication(ipAddress); 
      //get data from equipment. Blocking code. 
      IEnumerable<Logs> logs = equipment.GetLogs(handler); 
      //close communication with equipment 
      equipment.CloseCommunication(handler); 

      return logs; 
     }); 

     return await task; 
    } 
+0

Task.Run() создать поток в ThreadPool, а код блокирует, правильно использовать Task.Run в этом случае ??? –

+0

Call equipment.GetLogs (обработчик); задержка на несколько секунд, чтобы ответить. Блокирование потока в ThreadPool, я прочитал Это плохая практика ... –

+0

Вызов 'equipment.GetLogs (обработчик);' задержка на несколько секунд, чтобы ответить. Блокирование потока в ThreadPool, я прочитал Это плохая практика ... –

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