C# 通过任务<;T>;通过IPC

C# 通过任务<;T>;通过IPC,c#,asynchronous,ipc,C#,Asynchronous,Ipc,我在服务和WinForm应用程序之间有IPC通信。它们在类的帮助下相互通信,类利用以下接口: public interface IBaseIPC { Task<IPCConfig> GetConfig(); Task<IPCInfo> Activate(IPCConfig ipcConfig); Task<IPCInfo> CancelActivation(); Task<IPCInfo> GetInfo();

我在服务和WinForm应用程序之间有IPC通信。它们在类的帮助下相互通信,类利用以下接口:

public interface IBaseIPC
{

    Task<IPCConfig> GetConfig();
    Task<IPCInfo> Activate(IPCConfig ipcConfig);
    Task<IPCInfo> CancelActivation();
    Task<IPCInfo> GetInfo();
    Task<IPCInfo> Renew();
    Task<string> TestConnection(IPCConfig ipcConfig);
}
公共接口IBaseIPC
{
任务GetConfig();
任务激活(IPCConfig IPCConfig);
任务取消激活();
任务GetInfo();
任务更新();
任务测试连接(IPCConfig IPCConfig);
}
当这些方法是同步的时,它工作得很好。现在,当返回类型从IPCConfig切换到Task时,我在程序集“mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”中得到一个异常类型“System.Threading.Tasks.Task`1[[IPCInfo]”未标记为可序列化。
我发现它试图序列化任务,但失败了。有没有办法解决这个问题?

您将以什么二进制格式发送任务?这个问题没有合理的答案。因此,您无法发送任务。有意义吗

如果IPC库或框架本质上不是异步的,则不能将任务返回给它。框架必须理解它们

您可能正在处理一个场景。阅读并理解这一点。现在您将认识到您的处境并不好。这两种情况都是最糟糕的:没有异步IO好处,CPU使用率更高


怎么办?取决于你的应用程序。也许你根本不应该异步(因为框架不支持它)。

你会以什么二进制格式发送任务?这个问题没有合理的答案。因此,你不能发送任务。有意义吗

如果IPC库或框架本质上不是异步的,则不能将任务返回给它。框架必须理解它们

您可能正在处理一个场景。阅读并理解这一点。现在您将认识到您的处境并不好。这两种情况都是最糟糕的:没有异步IO好处,CPU使用率更高


怎么做?取决于你的应用程序。也许你根本不应该去异步(因为框架不支持异步).

我正在使用System.Runtime.Remoting。我正在制作一个UI来控制服务,它执行长时间运行的操作,如与远程服务器通信。最简单的方法是在UI端包装同步调用,但这意味着我必须第三次复制相同的代码,因为到目前为止,控制类看起来是这样的:[Serializable]公共类ServiceControl:MarshalByRefObject,IBaseIPC公共静态IBaseIPC客户端;公共任务GetConfig(){return client.GetConfig();}…}AFAIK远程处理不支持异步调用。你运气不好。但是为什么需要复制内容呢?只要尽可能地同步,并使UI异步(可能通过使用Task.Run包装远程处理调用,这是一种有效的策略)。好的,远程处理支持异步()但我不会使用它。与仅在UI中使用Wait Task.Run相比,它很难使用。我复制代码的原因是,我在不同的客户端类中实现了这些方法,这些客户端类利用了接口,然后我有了控制类,我只需转到SomeMethod(){client.SomeMethod();},现在我必须执行Task.Run()=>controlClass.SomeMethod())我想也许有更优雅的方法来做这件事。没有更多的代码和上下文,我不能推荐任何东西。但是我想你现在明白了这个问题。考虑除了UI之外,使所有的东西都同步。或者,使用WCF。然后你可以做一个同步服务和一个异步客户端。我使用Studio.RunTime.ReloTIn。我正在制作一个UI来控制。ol服务,它执行长时间运行的操作,如与远程服务器通信。最简单的方法是在UI端包装同步调用,但这意味着我必须第三次复制相同的代码,因为到目前为止控件类看起来像这样:[Serializable]公共类ServiceControl:MarshalByRefObject,IBaseIPC公共静态IBaseIPC客户端;公共任务GetConfig(){return client.GetConfig();}…}AFAIK远程处理不支持异步调用。你运气不好。但是为什么需要复制内容呢?只要尽可能地同步,并使UI异步(可能通过使用Task.Run包装远程处理调用,这是一种有效的策略)。好的,远程处理支持异步()但我不会使用它。与仅在UI中使用Wait Task.Run相比,它很难使用。我复制代码的原因是,我在不同的客户端类中实现了这些方法,这些客户端类利用了接口,然后我有了控制类,我只需转到SomeMethod(){client.SomeMethod();},现在我必须执行Task.Run()=>controlClass.SomeMethod())我想也许有更优雅的方法来做这件事。没有更多的代码和上下文,我不能推荐任何东西。但是我想你现在明白了这个问题。考虑除了UI之外,使所有的东西都同步。或者,使用WCF。然后你可以制作一个同步服务和一个异步客户端。转换KuroLi的答案到评论:也许是一个好的E。对此进行解释。将克鲁利的回答转换为评论:也许是一个很好的解释。