服务器上的异步WCF,有些调用会丢失

时间:2017-04-23 15:28:37

标签: wcf asynchronous

我的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;的格式。

为什么我需要它们在服务器端异步?因为我只是希望在客户端被销毁后请求在服务器上继续。客户端卸载后,其他方案(客户端异步)将在服务器上完成,或者我犯了一个错误......

现在有什么问题? 一些异步请求(在客户端卸载之前,客户端上的最后一条指令,在对同一服务器发出一些其他同步请求之后)很容易在没有任何警告的情况下执行。

对我的建筑或技术的任何建议表示赞赏。

1 个答案:

答案 0 :(得分:0)

编辑:

1- Environment.Exit(0)正在终止正在运行的appdomain和整个过程。我改变了这部分的配置。这一点很重要:Environment.Exit不仅会终止当前的appdomain。它终止了整个应用程序。关键是WCF是从同一个网站内部调用的,因此,整个应用程序中的终止对于继续运行是致命的。

2-我将操作合同更改为“IsOneWay = true”。这比“异步任务”模板更容易实现。网上有资源指出单向操作可能阻止客户端,直到他们可以在服务器的que上插入他们的请求。这已经是我想要的了。如果没有成功完成此任务,我不希望该过程继续进行。所以这对我来说不是问题。