0

我喜欢新的 C# 5 的asyncawait,我想将它设置为我以前使用 async whay 的 Tcp 应用程序之一(不是 async & await,实际上是 Begin*,End*)

在我的应用程序中,每条消息都有响应,因此每次使用 BeginSend 时,您都会收到一条与您第一次发送的消息相关的消息。(让我们假设命令和它的报告)

我想添加一个名为RequestAsync的新函数,您可以发送消息并等待响应到来。让我展示一下用法

string response = await RequestAsync("hi");

在这种情况下,您将发送一条“hi”消息,然后代码等待与此相关的响应出现。

我在使用Task.Factory.FromAsync时遇到问题,所以我尝试了以下代码,我想确保性能与TaskFactory方式大致相同。

public async Task<IRequestResult> SendRequestAsync(IRequest request, string message)
{
        IRequestResult result = BeginSendRequest(request, message);

        while (!result.IsCompleted)
        {
            await Task.Delay(1);
        }

        return result;
}

BeginRequest 是我自己的方法。

此致,佩曼·莫尔塔扎维

4

2 回答 2

4

不,这在效率方面会非常糟糕——你会醒来并需要每 5 毫秒重新安排一次。当您在周期之间有效睡眠时,您已经增加了延迟。

你应该回去尝试使用Task.Factory.FromAsync- 你没有告诉我们你尝试时出了什么问题,所以很难帮助你修复它......你可能没有正确实现异步编程模型模式开始和。(您没有为您的BeginSendRequest方法提供回调的事实暗示了这一点。)

我希望你的真实代码也没有catch {}......

于 2012-06-05T07:48:31.400 回答
0

轮询作为 IO 完成端口永远不可能高效,如果您只是在等待它而不做任何事情,为什么还要使用异步方法它只会增加开销。

于 2012-06-05T07:48:06.910 回答