【发布时间】:2017-02-16 19:31:59
【问题描述】:
我有一个服务器,它必须通过网络轮询一个设备,以获取信息,处理它,然后将它发送给用户。 设备勘测成为同步阻塞功能。
我的问题是:
如何创建一个自己的异步函数版本来使用Task或其他异步模式来执行这个函数???
考虑以下代码从设备获取信息:
IEnumerable<Logs> GetDataFromEquipment(string ipAddress)
{
Equipment equipment = new Equipment();
//Open communication with equipment. Blocking code.
int handler = equipment.OpenCommunication(ipAddress);
//get data from equipment. Blocking code.
IEnumerable<Logs> logs = equipment.GetLogs(handler);
//close communication with equipment
equipment.CloseCommunication(handler);
return logs;
}
谢谢
【问题讨论】:
-
你先让
GetLogs异步。 -
我该怎么做...
-
你必须让你的 IO 方法异步。例如发布 OpenCommunication 方法。我将首先向您展示如何做到这一点。你的通信是用什么实现的?什么 .net 设施/类?
-
如果您无权更改
Equipment类的代码,那么您唯一的方法就是在另一个线程上运行该方法-Task.Run可以很简单。如果您有权访问Equipment类 - 为Open..、GetLogs和Close..添加异步方法。所有 IO 操作都可以并且应该使用async-await方法完成,这将避免您浪费应用程序的线程资源只等待响应 -
设备类是设备制造商外部库的一部分。我用它们与设备通信。如何将这些同步调用转换为异步 IO 方法?
标签: c# asynchronous async-await task