【发布时间】:2016-03-05 17:56:54
【问题描述】:
我有几个服务正在运行,A 和 B(都是 web api)和一个 http 客户端。这是我想要异步完成的事件序列:
- 客户端调用 A 并将对象 O 作为参数传递,
- A 开始异步进程 (P1) 以对 O 执行操作,
- 当 P1 运行时,A 向 B [P2] 发送异步消息(这可能需要一段时间),以便 B 对其进行处理。本质上,A 现在是 B 的客户
[这是重要的部分]
- 一旦 P1 完成工作,我希望 A 将 OK 响应发送回调用客户端,
- 我不想让客户端等到 B 向 A 发送自己的响应后,A 才能用 OK 响应客户端,
- 就客户端而言,A 只做 P1,仅此而已,不关心 A 和 B 之间的通信,它只关心 P1 的结果
- A 应按自己的节奏处理 B 可能在自己的时间发送的任何响应
- P1 和 P2 都是异步方法,我已经定义并工作了
6-9 仅用于说明目的,但我如何完成 5?
我正在使用 MS 堆栈、VS2013、C#5
这是我正在尝试实现的伪代码:
// this is the clinent and where it all begins
class Class1
{
static void Main()
{
using (var client = new HttpClient())
{
var o = new SomeObject();
var response = client.PostAsJsonAsync(api, o);
Console.Write(response.Status);
}
}
}
// this one gets called from the client above
class ServiceA
{
public async Task<IHttpActionResult> Post([FormBody] SomeObject someObject)
{
// this one I want to wait for
var processed = await ProcessSomeObjectA(SomeObject some);
// now, how do I call SendToService so that this POST
// will not wait for completion
SendToService(someObject);
return processed.Result;
}
private async Task<bool> ProcessSomeObjectA(SomeObject some)
{
// whatever it does it returns Task<bool>
return true;
}
private async Task<IHttpActionResult> SendToService(SomeObject someObject)
{
using (var client = new HttpClient())
{
var o = new SomeObject();
var response = await client.PostAsJsonAsync(api, o);
return response.StatusCode == HttpStatusCode.OK;
}
}
}
class ServiceB
{
// this gets called from ServiceA
public async Task<IHttpActionResult> Post([FormBody] SomeObject someObject)
{
return (await ProcessSomeObjectB(someObject))) ? Ok() : BadResponse();
}
private async Task<bool> ProcessSomeObjectB(SomeObject some)
{
// whatever it does it returns Task<bool>
return true;
}
}
【问题讨论】:
-
你能提供一些示例代码吗?会不会像在 P1 中不等待 P2 一样简单?我假设 P1 可以安全返回,而无需 P2 所做的任何事情。编辑:我只是重读了#7...不要认为这很简单。
-
您声明您已经拥有异步代码,因此不清楚您的实际问题是什么。到目前为止你有什么?请提供一些代码作为参考,然后解释你卡在什么/哪里。
-
@Borophyll 没错,P1 并不关心 P2 做什么或返回什么。只有客户关心 P1。无论 P2 返回什么都应该由 ServiceA 处理。我们想模拟客户端不关心的长时间运行进程(P2),但它是从 ServiceA 调用的(反过来又被客户端调用)
-
@Igor 我包含了上面的伪代码。与其说是这些异步方法的详细实现,不如说是如何调用它们以便无需等待结果(在 ServiceA 中)
标签: c# asynchronous