服务结构客户端退出

时间:2016-11-18 07:15:05

标签: wcf azure microservices azure-service-fabric

我已经构建了一个用于缓存对象的Azure服务结构应用程序/服务。现在使用下面的代码,我在一个调用该服务的控制台窗口中创建了一个客户端。 当在c.Add上放置断点然后单步执行时,程序就会退出。没有例外,"完成"没有打印,程序只退出代码0。 该服务正在运行并处于健康状态。我该怎么做才能找出错误的内容?

class Program
{
    static void Main(string[] args)
    {
        Test();
    }

    static async void Test()
    {
        Uri serviceName = new Uri("fabric:/CacheApp/PreorderCache");
        ServicePartitionResolver resolver = new ServicePartitionResolver(() => new System.Fabric.FabricClient());
        NetTcpBinding binding = (NetTcpBinding)WcfUtility.CreateTcpClientBinding();

        Client c = new Client(new WcfCommunicationClientFactory<IPreorders>(binding, null, resolver), serviceName, 1);

        try
        {
            PreOrder po = await c.Get("50", "11001", OrderNumber = "123456" });
            Console.WriteLine("done");
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
    }
}

经过调查,它似乎与服务中使用的交易有关。

服务永远不会过去

await tx.CommitAsync();

这里是服务中的错误代码,没什么特别的

await preOrders.GetAsync(tx, d, s, (k, v) => preOrder);
ServiceEventSource.Current.ServiceMessage(this, "after update");
await tx.CommitAsync();
ServiceEventSource.Current.ServiceMessage(this, "after commit");

1 个答案:

答案 0 :(得分:1)

Test是一种不等待Main的异步方法。因此,您的计划不会等待Test完成。

添加GetAwaiter().GetResult()会使您的Test方法像常规方法一样,阻止直到c.Get()完成。

因此请使用选项2,然后删除&#39; async&#39;。

(并保留使用async void到异步事件处理程序。)