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