gpt4 book ai didi

c# - 从同一台机器上的另一个进程接收 Task

转载 作者:行者123 更新时间:2023-11-30 20:28:21 26 4
gpt4 key购买 nike

我有两个内部进程,用于将长 sdos 字符串上传到 API。进程 1 从另一个流中读取这些。进程 1(客户端)通过 [ServiceContract] 向进程 2(服务器)发送字符串和一个 [MessageContract] .然后进程 2 将其发送到 API,API 反过来处理 sdos 并上传到服务器。

[MessageContract]
public class CallRequestMessage
{
[MessageHeader]
public string Sdos;
[MessageHeader]
public int ArrayLength;
[MessageBodyMember]
public Stream SdosStream;
}

[MessageContract]
public class CallResponseMessage
{
[MessageHeader]
public Task<ResultCode> Task;
}

由于处理字符串的大部分时间都在 API 中,我想尝试返回一个 Task<ResultCode>从我的服务器,一旦处理结束,将从 API 获得结果。然后我的线程可以进行客户端处理(在这种情况下,从流输入中读取 sdos 字符串)。

我的问题是返回给客户端的任务似乎与我在服务器上创建的任务不同。在服务器上我有代码

task = Task<ResultCode>.Factory.StartNew(() =>
{
ResultCode res;
lock (SyncObject)
res = upload(/* input */)
return res;
});

// ...other code

return new CallResponseMessage { Task = task };

哪里upload是 API 中的一种方法,由进程 2 使用 [DllImportAttribute] 访问.

使用日志,我看到任务确实在服务器上完成(所有 sdo 都已上传),但是在客户端,所有任务似乎都没有开始,因此检索结果是不可能直接。

我想到的另一种方法是不从服务器返回任何内容,并添加一个单独的方法追溯到服务器、等待任务并返回聚合结果。不过,我想尝试直接取回任务,因为此实现可能是我项目中 future 服务的模型。

感谢您的帮助。

最佳答案

没有Task 跨进程边界的实例。服务器的任务是将数据发送到客户端的 Task。客户端任务是接收数据的任务。如果您在自动生成的 WCF 客户端上使用 asnyc 方法,默认情况下,WCF 不会将数据从服务器流式传输到客户端,因此您的正常流程将是:

启动客户端任务 -> 发送请求 -> 启动服务器任务 -> 结束服务器任务 -> 发送响应 -> 结束客户端任务

为了异步执行服务器任务,您可以使用任务异步模式 (TAP) 设计您的服务方法。此示例来自 official documentation :

public class SampleService:ISampleService   
{
// ...
public async Task<string> SampleMethodTaskAsync(string msg)
{
return Task<string>.Factory.StartNew(() =>
{
return msg;
});
}
// ...
}

任务在客户端和服务器上的好处不在于客户端可以在服务器发送数据的同时接收数据,而是允许服务器在其他请求等待长时间运行的操作(例如数据访问)时处理更多传入的请求) 和客户端在接收到数据时做一些有用的事情。

您的选择是:

使用单独的异步服务器和客户端操作

除非您正在传输大量数据并且性能很关键,否则这种情况没有任何问题。您仍然可以使用任务进行异步编程。但是,您返回任务的方法将不起作用。使用描述的异步服务方法和自动生成的异步客户端方法的组合。您基本上会获得相同的结果,即客户端和服务器将异步执行操作。

流式传输数据

如果您必须在服务器发送数据时在客户端开始处理(这只会给您带来大量数据的实际好处),您可以流式传输来自服务器的数据。这个问题太大,无法在此处涵盖,但最好从 official documentation 开始。 .

关于c# - 从同一台机器上的另一个进程接收 Task<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47658958/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com