我已经构建了一个用于缓存对象的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");
答案 0 :(得分:1)
Test
是一种不等待Main
的异步方法。因此,您的计划不会等待Test
完成。
添加GetAwaiter().GetResult()
会使您的Test
方法像常规方法一样,阻止直到c.Get()
完成。
因此请使用选项2,然后删除&#39; async&#39;。
(并保留使用async void到异步事件处理程序。)