私は多くの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
これは遅いコードではありません。あなたはそれを測定しましたか? –
サブのSEは遅くない、問題は私はそれを多くの時間を起動する必要があります。質問をもっと明確に更新しました。 –