使用Task.Factory.FromAsync发出问题

时间:2012-06-05 07:43:19

标签: c# asynchronous async-ctp async-await

我很喜欢新的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

2 个答案:

答案 0 :(得分:4)

不,这在效率方面会非常糟糕 - 你会醒来并要求每5毫秒重新安排一次。您在循环之间有效地睡眠时也增加了延迟。

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

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

答案 1 :(得分:0)

Poling永远不会像IO完成端口一样高效,为什么即使使用异步方法,如果你只是等待它而不做任何同时,它只是广告针头开销。 / p>