.NET - 对于具有CPU和IO操作的函数,最好使用异步还是线程?

时间:2016-06-19 22:34:04

标签: vb.net multithreading async-await

我有一个类,它有一个可以执行大量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

1 个答案:

答案 0 :(得分:1)

  

有一个类有一个执行大量IO的方法

然后它是一个IO绑定操作,在这种情况下,你应该考虑使用Asynchronous方法和最佳方法让一个人使用async - await

如果操作是CPU绑定操作,通常应选择在单独的后台线程中执行操作,这与在CPU上执行的更多计算有关。