Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net .NET-对于具有CPU和IO操作的函数,最好使用异步或线程?_Vb.net_Multithreading_Async Await - Fatal编程技术网

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

Vb.net .NET-对于具有CPU和IO操作的函数,最好使用异步或线程?,vb.net,multithreading,async-await,Vb.net,Multithreading,Async Await,我有一个类,它有一个方法,可以执行很多IO。我需要启动这个方法a,但它还需要执行CPU操作来检查在哪里写入数据。在这种情况下,最好使用异步函数或新任务 下面是代码(VB.NET)。对每个“被测对象”调用该方法,被测对象约为3000。数据必须尽快写入磁盘。此外,数据以每秒50的速率到达。理想情况下,当一个被测对象的数据到达时,应该将其写入磁盘,而不必等待另一个被测对象完成数据写入 Public Sub saveMeasurand(ByVal measurand_id As String)

我有一个类,它有一个方法,可以执行很多IO。我需要启动这个方法a,但它还需要执行CPU操作来检查在哪里写入数据。在这种情况下,最好使用异步函数或新任务

下面是代码(VB.NET)。对每个“被测对象”调用该方法,被测对象约为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
公共子saveMeasurand(ByVal measurand_id作为字符串)
Dim作为字符串表示id=测量值id
作为排序字典的Dim数据(日期时间、字符串)
Dim save_表示数据为布尔值
Dim first_表示数据为布尔值
暗淡的第一滴答声和长的一样
暗淡最后日期表示为日期时间
Dim curr_date作为日期时间
将最后的滴答声调暗
暗咖喱和长咖喱一样
尺寸基准_刻度与长度相同
将行变暗为字符串
Dim meas_路径作为字符串
数据=Me.数据(测量id)
尝试
保存测量数据=Me.save测量数据(测量id)
捕获ex作为KeyNotFoundException
保存测量数据=真
结束尝试
如果不保存测量数据,则
抛出新异常(
“无法为id“”保存数据”&
米苏德&
“,资源已锁定”
)
如果结束
如果Me.dt=0,则
如果结束
尝试
Me.save_data(meas_id)=False
尝试
第一个测量数据=Me.first测量数据(测量id)
捕获ex作为KeyNotFoundException
第一个参数表示数据=真
结束尝试
Dim datum_keys()作为日期时间
datum\u keys=datum.keys.ToArray()
如果基准长度<1,则
抛出新异常(“没有要保存的数据”)
如果结束
如果首先表示数据,那么
first_ticks=基准点。first()。ticks
其他的
first_ticks=Me.last_date(meas_id)。ticks+Me.dt
如果结束
最后日期=基准日期。最后()
最后滴答声=最后滴答声表示最后滴答声
当前刻度=第一个刻度
对于每个基准日期,将其作为基准键中的日期时间
datum_ticks=datum_date.ticks
而基准刻度-电流刻度>Me.dt刻度公差
当前日期=新日期时间(当前刻度)
row=Me.nanDatum(当前日期,测量id)
meas_path=Me.measureandpath(当前日期,meas_id)
将writer用作StreamWriter=File.AppendText(meas_路径)
writer.WriteLine(世界其他地区)
终端使用
curr_ticks+=Me.dt
结束时
行=基准(基准日)
测量路径=MeasureAndPath(基准日期,测量id)
将writer用作StreamWriter=File.AppendText(meas_路径)
writer.WriteLine(世界其他地区)
终端使用
Me.数据(测量id).删除(基准日期)
curr_ticks+=Me.dt
下一个
Me.first_data(meas_id)=False
Me.last_date(meas_id)=last_date_meas
特例
“记录我
最后
Me.save_data(meas_id)=True
结束尝试
端接头
有一个类,它有一个执行大量IO的方法

这是一个IO绑定操作,在这种情况下,您应该考虑使用<代码>异步< /代码>方法,最好的方法是使用<代码>异步-等待< /代码> ./P>


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

这不是慢代码。你测量过吗?潜艇本身并不慢,问题是我需要很多时间来发射它。我更新了问题,使之更清楚。我不确定我是否理解了。你的意思是,如果该方法执行IO,即使它也执行CPU计算,它应该使用async Wait,而不管在IO和CPU上花费的时间是多少?@MarcoSulla,当你说该方法是IO绑定的;这意味着它主要是IO,然后CPU处理和Inc这样的情况下,你应该考虑使用异步方法(同样用于CPU绑定的工作)。