C# 接收任务<;T>;来自同一台机器上的另一个进程

C# 接收任务<;T>;来自同一台机器上的另一个进程,c#,task,C#,Task,我有两个内部进程,用于将长sdos字符串上载到API。进程1从另一个流读取这些数据。进程1(客户端)通过[ServiceContract]和[MessageContract]向进程2(服务器)发送字符串。进程2然后将其发送到API,API依次处理SDO并上传到服务器 [MessageContract] public class CallRequestMessage { [MessageHeader] public string Sdos; [MessageHeader]

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

[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;
}
[MessageContract]
公共类CallRequestMessage
{
[消息头]
公共字符串SDO;
[消息头]
公共int排列长度;
[MessageBodyMember]
公共流SdosStream;
}
[信息合同]
公共类CallResponseMessage
{
[消息头]
公共任务;
}
由于处理字符串的大部分时间都在API中,因此我想尝试从服务器返回一个
任务
,一旦处理结束,它将从API中获得一个结果。然后,我的线程可以进行客户端处理(在本例中,从流输入读取sdos字符串)

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

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

// ...other code

return new CallResponseMessage { Task = task };
task=task.Factory.StartNew(()=>
{
结果代码res;
锁定(同步对象)
res=上传(/*输入*/)
返回res;
});
//…其他代码
返回新的CallResponseMessage{Task=Task};
其中,
upload
是API中的一种方法,由进程2使用
[DllImportAttribute]
访问

通过使用日志,我看到任务确实在服务器上完成(所有SDO都已上载),但是在客户端,所有任务似乎都没有启动,因此无法直接检索结果

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


感谢您的帮助。

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

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

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

public类SampleService:ISampleService
{   
// ...  
公共异步任务SampleMethodTaskAsync(字符串消息)
{   
返回Task.Factory.StartNew(()=>
{   
返回味精;
});   
}  
// ...  
}  
客户端和服务器上的任务的好处不在于客户端可以在服务器发送数据时接收,而在于允许服务器在其他请求等待长时间运行的操作(例如数据访问)时处理更多传入请求,并允许客户端在接收数据时做一些有用的事情

你的选择是:

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

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

流式传输数据


如果必须在服务器发送数据时在客户机上开始处理(这只会给您带来大量数据的实际好处),则可以从服务器流式传输数据。这个问题太大,无法在这里讨论,但一个好的起点是。

我对
任务[]
在进程之间工作的期望值为零,同样,我对它在WCF上工作的期望值为零。。。。我认为这不是解决你试图解决的问题的正确方法。
public class SampleService:ISampleService   
{   
   // ...  
   public async Task<string> SampleMethodTaskAsync(string msg)   
   {   
      return Task<string>.Factory.StartNew(() =>   
      {   
         return msg;   
      });   
   }  
   // ...  
}