我的WCF看起来像这样:
public interface IIO
{
[OperationContract]
string Method1(string Data, Identity ID);
[OperationContract]
string Method2(string Data, Identity ID);
.
.
.
[OperationContract]
Task<int> Async1(string Data, Identity ID);
[OperationContract]
Task<int> Async2(string Data, Identity ID);
}
这是服务器上Async1的实现:
public async Task<int> Async1(string Data, Identity ID)
{
var myTask = Task.Factory.StartNew(() => InternalAsync1(Data, ID));
var result = await myTask;
return result;
}
客户端的工作方式如下:我有一个代理实例,一旦创建用于客户端的生命周期,然后一个接一个地使用方法。在他开始时,我认为保持代理实例几秒钟将节省一些时间重新连接,或者我可能是错的...
GlobalInstance_of_ServiceReference.Async1(data, ID);
//No waiting for operation to finish, it may take a long time...
Environmen.Exit(0);
//Appdomain will get destroyed by mother application after this
执行任何异步任务后,客户端将从appdomain卸载。客户端不等待异步操作完成,它可能是服务器上的长时间运行任务。
异步方法实际上返回无效,或者返回虚拟0以符合Task&lt;&gt;的格式。
为什么我需要它们在服务器端异步?因为我只是希望在客户端被销毁后请求在服务器上继续。客户端卸载后,其他方案(客户端异步)将在服务器上完成,或者我犯了一个错误......
现在有什么问题? 一些异步请求(在客户端卸载之前,客户端上的最后一条指令,在对同一服务器发出一些其他同步请求之后)很容易在没有任何警告的情况下执行。
对我的建筑或技术的任何建议表示赞赏。
答案 0 :(得分:0)
编辑:
1- Environment.Exit(0)正在终止正在运行的appdomain和整个过程。我改变了这部分的配置。这一点很重要:Environment.Exit不仅会终止当前的appdomain。它终止了整个应用程序。关键是WCF是从同一个网站内部调用的,因此,整个应用程序中的终止对于继续运行是致命的。
2-我将操作合同更改为“IsOneWay = true”。这比“异步任务”模板更容易实现。网上有资源指出单向操作可能阻止客户端,直到他们可以在服务器的que上插入他们的请求。这已经是我想要的了。如果没有成功完成此任务,我不希望该过程继续进行。所以这对我来说不是问题。