2016-06-19 7 views
-2

私は多くのIOを行うメソッドを持つクラスを持っています。私はこのメソッドを起動する必要がありますしかし、それはまた、データを書き込むためにどこを確認するCPU操作を行う必要があります。この場合、非同期関数や新しいタスクを使用する方が良いでしょうか?.NET - 非同期またはスレッドを使用して、CPUおよびIO操作を持つ関数を使用する方が良いですか?

コードは次のとおりです(VB.NET)。メソッドはすべての "measurand"に対して呼び出され、measurandsは〜3000です。データはできるだけ早くディスクに書き込まなければなりません。さらに、毎秒50のデータが到着します。理想的には、測定量のデータが到着すると、別の測定量がデータの書き込みを完了するのを待たずに、ディスク上に書き込まれるべきです。

Public Sub saveMeasurand(ByVal measurand_id As String) 
    Dim meas_id As String = measurand_id 
    Dim datum As SortedDictionary(Of DateTime, String) 
    Dim save_meas_data As Boolean 
    Dim first_meas_data As Boolean 
    Dim first_ticks As Long 
    Dim last_date_meas As DateTime 
    Dim curr_date As DateTime 
    Dim last_ticks As Long 
    Dim curr_ticks As Long 
    Dim datum_ticks As Long 
    Dim row As String 
    Dim meas_path As String 

    datum = Me.data(meas_id) 

    Try 
     save_meas_data = Me.save_data(meas_id) 
    Catch ex As KeyNotFoundException 
     save_meas_data = True 
    End Try 

    If Not save_meas_data Then 
     Throw New Exception(
      "Can't save data for id '" & 
      meas_id & 
      "', resource is locked" 
     ) 
    End If 

    If Me.dt = 0 Then 

    End If 

    Try 
     Me.save_data(meas_id) = False 

     Try 
      first_meas_data = Me.first_data(meas_id) 
     Catch ex As KeyNotFoundException 
      first_meas_data = True 
     End Try 

     Dim datum_keys() As DateTime 
     datum_keys = datum.Keys.ToArray() 

     If datum_keys.Length < 1 Then 
      Throw New Exception("No data to save") 
     End If 

     If first_meas_data Then 
      first_ticks = datum_keys.First().Ticks 
     Else 
      first_ticks = Me.last_date(meas_id).Ticks + Me.dt 
     End If 

     last_date_meas = datum_keys.Last() 
     last_ticks = last_date_meas.Ticks 
     curr_ticks = first_ticks 

     For Each datum_date As DateTime In datum_keys 
      datum_ticks = datum_date.Ticks 

      While datum_ticks - curr_ticks > Me.dt_tolerance 
       curr_date = New DateTime(curr_ticks) 
       row = Me.nanDatum(curr_date, meas_id) 
       meas_path = Me.measurandPath(curr_date, meas_id) 

       Using writer As StreamWriter = File.AppendText(meas_path) 
        writer.WriteLine(row) 
       End Using 

       curr_ticks += Me.dt 
      End While 

      row = datum(datum_date) 
      meas_path = Me.measurandPath(datum_date, meas_id) 

      Using writer As StreamWriter = File.AppendText(meas_path) 
       writer.WriteLine(row) 
      End Using 

      Me.data(meas_id).Remove(datum_date) 
      curr_ticks += Me.dt 
     Next 

     Me.first_data(meas_id) = False 
     Me.last_date(meas_id) = last_date_meas 
    Catch ex As Exception 
     ' log me 
    Finally 
     Me.save_data(meas_id) = True 
    End Try 
End Sub 
+1

これは遅いコードではありません。あなたはそれを測定しましたか? –

+0

サブのSEは遅くない、問題は私はそれを多くの時間を起動する必要があります。質問をもっと明確に更新しました。 –

答えて

1

IO

の多くは、それはIOバインド操作だんとこのような場合に使用すると、1つを持っているAsynchronous方法と最善の方法を使用することを検討すべきメソッドを持つクラスを持っていますasync - awaitを使用しています。

CPUでより多くの計算を行う必要があるCPUバインド操作であれば、通常は別のバックグラウンドスレッドで操作することを選択する必要があります。

+0

私は理解しているか分からない。メソッドがIOを実行する場合、たとえそれがCPUの計算を行うとしても、IO対CPUの時間に関係なく、非同期待機を使用する必要がありますか? –

+0

@MarcoSulla、メソッドがIOバインドであると言うとき。つまり、ほとんどの場合、CPUの処理とIOの場合は、非同期メソッドを使用することを検討する必要があります(CPUのバインド作業と同じ) – Rahul

関連する問題