我有一个类,它有一个可以执行大量IO的方法。我需要启动此方法但是它还需要执行CPU操作来检查写入数据的位置。在这种情况下使用异步功能或新任务会更好吗?
代码如下(VB.NET)。对每个" measurand"调用该方法,并且测量值为~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
答案 0 :(得分:1)
有一个类有一个执行大量IO的方法
然后它是一个IO绑定操作,在这种情况下,你应该考虑使用Asynchronous
方法和最佳方法让一个人使用async - await
。
如果操作是CPU绑定操作,通常应选择在单独的后台线程中执行操作,这与在CPU上执行的更多计算有关。