我很喜欢新的C#5的异步和等待,我想把它设置为我之前的Tcp应用程序之一,我使用了async whay(不是async& ;等待,实际上是开始*,结束*)
在我的应用程序中,每条消息都有响应,因此每次使用BeginSend时,您都会收到与您首次发送的消息相关的消息。 (假设命令和它的报告)
我想添加一个名为 RequestAsync 的新功能,您可以发送消息并等到响应响起。让我展示一下用法
string response = await RequestAsync("hi");
在这种情况下,您将发送“hi”消息,然后代码等待,直到与此相关的响应出现。
我在使用 Task.Factory.FromAsync 时遇到了问题,所以我尝试了以下代码,我想确保性能与 TaskFactory 方式大致相同。< / p>
public async Task<IRequestResult> SendRequestAsync(IRequest request, string message)
{
IRequestResult result = BeginSendRequest(request, message);
while (!result.IsCompleted)
{
await Task.Delay(1);
}
return result;
}
和BeginRequest是我自己的方法。
真诚的,你的, Peyman Mortazavi
答案 0 :(得分:4)
不,这在效率方面会非常糟糕 - 你会醒来并要求每5毫秒重新安排一次。您在循环之间有效地睡眠时也增加了延迟。
你应该回去尝试使用Task.Factory.FromAsync
- 你没有告诉我们你在尝试时出了什么问题,所以很难帮你解决它...你可能没有实现正确的异步编程模型模式开始。 (您没有向BeginSendRequest
方法提供回调的事实暗示了这一点。)
我希望您的真实代码没有catch {}
......
答案 1 :(得分:0)
Poling永远不会像IO完成端口一样高效,为什么即使使用异步方法,如果你只是等待它而不做任何同时,它只是广告针头开销。 / p>