2017-02-16 59 views
0

ネットワークを介して装置をポーリングして情報を取得し、処理してからユーザーに送信するサーバーがあります。 機器調査は同期ブロッキング機能になります。非同期呼び出しで同期関数をラップする#

私の質問は:

タスクを使用して、この機能または別の非同期パターンを実行するために独自の非同期関数のバージョンを作成する方法?

機器から情報を取得するには、次のコードを考えてみましょう:

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

をあなたは非同期/を使用することができますが

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

コールequipment.GetLogs(ハンドラ);応答するのに数秒かかる。 ThreadPoolでスレッドをブロックすると、それは悪い習慣です。 –

+0

'equipment.GetLogs(ハンドラ);と呼んで、応答するのに数秒間遅れます。スレッドプールでスレッドをブロックすると、私はそれを読んだことがあります。悪い習慣です... –

関連する問題