如何使用CancellationToken调用Azure服务结构远程代理?

时间:2018-07-13 13:29:01

标签: azure-service-fabric service-fabric-remoting

根据文档样本,代理是这样创建的:

IMyService helloWorldClient = ServiceProxy.Create<IMyService>(new 
Uri("fabric:/MyApplication/MyHelloWorldService"));

string message = await helloWorldClient.HelloWorldAsync();

但是,如果我需要限制最大响应时间,我通常会创建CancellationToken并将其传递给呼叫。有没有办法将令牌传递给代理,以便它取消等待来自远程服务的结果?

3 个答案:

答案 0 :(得分:0)

据我所知,将取消令牌传递给调用是不可能的,因为它只是一个代理,并且只接受您在接口中描述的方法的参数。

要完成所需的操作,请在一段时间后取消操作,您必须配置FabricTransportRemotingListenerSettings并将OperationTimeout设置为所需的超时。默认值为5分钟。

您也可以通过服务settings.xml中的T​​ransportSettings进行此设置。

以下链接将显示有关如何设置FabricTransportRemotingListenerSettings或TransportSettings配置的两个示例。 https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-reliable-services-secure-communication

文档未显示,但您必须设置的参数为: OperationTimeout

对演员也可以这样做,请参见here,请注意,对于演员而言,某些设置是不同的。

答案 1 :(得分:0)

您可以在V2堆栈中执行此操作,我还没有尝试过V1堆栈,但是它也可以在其中工作。将CancellationToken类型的参数添加到方法签名中:

void HelloWorldAsync(CancellationToken cancellationToken);

此令牌随后将通过代理传递给ServicePartitionClient.InvokeWithRetryAsync方法。

生成的代理方法将如下所示:

Task<string> IMyService.HelloWorldAsync(CancellationToken cancellationToken)
{
    IServiceRemotingRequestMessageBody serviceRemotingRequestMessageBody = base.CreateRequestMessageBodyV2("MyNamespace.IMyService", "HelloWorldAsync", 1);
    Task<IServiceRemotingResponseMessageBody> task = base.InvokeAsyncV2(
    1, -1, "HelloWorldAsync", serviceRemotingRequestMessageBody,
    cancellationToken);
    return base.ContinueWithResultV2<ServiceInfoResponse>(task);
}

没有CancellationToken参数,代理方法如下:

Task<string> IMyService.HelloWorldAsync()
{
    IServiceRemotingRequestMessageBody serviceRemotingRequestMessageBody = base.CreateRequestMessageBodyV2("MyNamespace.IMyService", "HelloWorldAsync", 1);
    Task<IServiceRemotingResponseMessageBody> task = base.InvokeAsyncV2(
    1, -1, "HelloWorldAsync", serviceRemotingRequestMessageBody,
    CancellationToken.None);
    return base.ContinueWithResultV2<ServiceInfoResponse>(task);
}

如果要检查生成的代理程序集,请在EntryPoint程序集或定义了服务接口的程序集中使用以下属性:

[assembly: CodeBuilder(EnableDebugging = true)]

答案 2 :(得分:0)

对于仍然有兴趣正确执行此线程要求的人,下面的链接可以作为答案吗?

https://blogs.msdn.microsoft.com/azureservicefabric/2016/02/23/service-fabric-sdk-v1-5-175-and-the-adoption-of-virtual-machine-scale-sets/

内容:

对IService / IActor的CancellationToken支持

可靠的服务和可靠的Actor方法现在支持可以通过ActorProxy和ServiceProxy进行远程管理的取消令牌,从而使您可以实现协作取消。想要取消长期运行的服务或参与者方法的客户端可以发出取消令牌的信号,并且取消意图将传播到参与者/服务方法。然后,该方法可以通过查看其取消令牌参数的状态来确定何时停止执行。

例如,可以将具有可能长期运行的方法的演员合同建模如下:

    public interface IPrimeNumberActorInterface : IActor
    {

        Task<ulong> FindNextPrimeNumberAsync
            (ulong previous, CancellationToken cancellationToken);

    }

希望取消方法执行的客户代码可以通过取消取消令牌来传达其意图。