我想为网络 I/O 功能提供一个异步包装器。目前我看到两种方式,只有很小的区别。
第一的
Public Shared Async Function GetMacAddressFromArpAsync(ipAddress As IPAddress) As Threading.Tasks.Task(Of String) Dim t As New Threading.Tasks.Task(Of String)(Function() GetMacAddressFromArp(ipAddress)) t.Start() Await t Return t.Result End Function
第二
Public Shared Async Function GetMacAddressFromArpAsync(ipAddress As IPAddress) As Threading.Tasks.Task(Of String) Dim t As New Threading.Tasks.Task(Of String)(Function(ip As IPAddress) GetMacAddressFromArp(ip), ipAddress) t.Start() Await t Return t.Result End Function
我应该更喜欢第一种方式(正确键入,使用匿名函数)还是第二种方式(装箱在一个对象中,编译器没有创建辅助函数)?它有什么不同吗?如果有,为什么?或者有没有更好的方法来为我的阻塞调用提供一个 *Async 函数?
编辑:另外 GetMacAddressFromArp 被重载。它需要一个 IPAddress 或一个字符串(主机名)。如果有一种方法可以保存样板代码,那就更好了。
编辑澄清:我得到了 n 个 IPAddresses 的列表。我需要为每一个调用一个函数。此函数对 Windows API ( SendARP
) 进行阻塞(网络)调用,每个调用大约需要 0.1 到 2 秒。我想异步和并行地调用它们,所以我不想要一个假的异步包装器,而是一个实际上使我的调用异步的包装器。
然后我想调用我的包装器函数(对于每个元素),从而产生一个(聚合的)返回值列表,或者更好的方式是每次调用返回时都会引发一个事件。
我想使用使我能够做到这一点的最低 .Net Framework 版本。4.0 可以,但我不能使用 4.5。