您是否考虑过将 WCF 主机添加到您的客户端?这样你就可以得到完整的双向通讯。
客户端连接到服务器并将服务器连接详细信息返回给客户端客户
端请求长时间运行操作以开始
服务器随着工作的进行向客户端 WCF 主机发送多个更新。
服务器将完成的工作发送给客户端。
这使您的客户端可以自由地做其他事情,根据您认为合适的方式使用来自服务器的消息。可能会在消息进入时更新状态区域。
您甚至可以让服务器维护一个客户端列表并向所有客户端发送更新。
--------编辑---------
当我说 WCF 主机时,我的意思是ServiceHost
它可以从 App.config 中的 XML 或直接通过代码自动创建。
var myUri = new Uri[0];
myUri[0] = new Uri("net.tcp://localhost:4000");
var someService = new SomeService(); //implements ISomeService interface
var host = new ServiceHost(someService, myUri);
var binding = new NetTcpBinding(); // need to configure this
host.AddServiceEndpoint(typeof(ISomeService), binding, "");
host.Open();
代理是我用来描述客户端用来连接服务器的术语,它是在我遇到的一个早期示例中,从那以后它就一直困扰着我。同样可以通过两种方式创建。
var binding = new NetTcpBinding(); // need to configure this
var endpointAddress = new EndpointAddress("net.tcp://localhost:4000");
var factory = new ChannelFactory<ISomeService>(binding, endpointAddress);
var proxy = factory.CreateChannel();
proxy.DoSomeWork();
因此,在典型的客户端/服务器应用程序中,您拥有
CLIENT APP 1 SERVER APP CLIENT APP 2
proxy------------->ServiceHost<-------proxy
我的建议是您也可以使客户端成为“服务器”
CLIENT APP 1 SERVER APP CLIENT APP 2
proxy------------->ServiceHostA<------proxy
ServiceHostB<------proxy1
proxy2------------>ServiceHostB
如果您这样做,您仍然可以根据需要将大型任务拆分为较小的任务(您提到了内存问题),但从事情的声音来看,它们仍然可能需要一些时间,这样进度更新仍然可以发送回客户端或如果您希望每个人都知道正在发生的事情,甚至是所有客户。不需要回调,但您仍然可以根据需要使用它们。