2017-02-16 79 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方法異步。 例如交OpenCommunication方法。 我會先告訴你如何做到這一點。 你的溝通是用什麼來實現的? 什麼.net設施/類? –

回答

1

您可以先使用異步/ AWAIT

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()是一個線程池創建線程和代碼阻塞,是正確使用Task.Run在這種情況下??? –

+0

調用equipment.GetLogs(handler);延遲幾秒鐘來回應。在ThreadPool中阻塞線程,我讀過這是一個不好的做法... –

+0

調用'equipment.GetLogs(handler);'延遲幾秒鐘來響應。阻止ThreadPool中的線程,我已閱讀這是一個不好的做法... –