我想"创建或替换"postgres表的触发器.但是,没有这样的sql表达式.
我看到我可以先做一个"DROP TRIGGER IF EXISTS"(http://www.postgresql.org/docs/9.5/static/sql-droptrigger.html).
我的问题是:
请注意,oracle中存在"创建或替换触发器"(https://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_triggers.htm).然后,
我的程序出现死锁,但我不知道为什么以及如何解决它。
精简版:
一个asynctosync方法锁定等待异步调用,它调用另一个,依此类推,直到HttpClient.PostAsync调用。http post 调用永远不会发生,至少它没有到达服务器(我也拥有)。客户端没有错误。我的主要问题是在这个 SO 问题的末尾。谢谢!
更长的版本:
我知道很容易出现死锁,我们必须小心。我试图坚持 1. 将异步传播到所有方法和 2.ConfigureAwait(false)尽可能使用/有意义的建议。(我认为这一点的主要倡导者是 Stephen Cleary 作为他的博客和我阅读过的许多 SO 中的答案)。
好吧,我的程序……不幸的是,我不能在这里发布完整的示例代码,它很长;我把它描述为一个同步方法A,它调用一个异步方法B,它调用另一个异步,它调用另一个异步,等等。最终最后一个异步调用是HttpClient.PostAsync.
程序停止在await HttpClient.PostAsync。此外,Http post 永远不会触发(我拥有目标服务器,在这种情况下它永远不会收到请求)。(我仔细检查了 uri 等)。
因此,同步方法会锁定等待B的异步任务完成,而这从未发生过。A看起来像这样:
public Byte[] A()
{
var task = BAsync();
return task.GetAwaiter().GetResult();
}
Run Code Online (Sandbox Code Playgroud)
我以这种方式使用同步,因为他的方法不需要返回上下文,我看到斯蒂芬在 Nito 中建议的方法是使用它实现的。(我也尝试过task.Result,但结果相同)。
http post调用的代码是:
private static async Task<HttpResponseMessage> PostAsync(Uri serverUri, HttpContent httpContent)
{
var client = new HttpClient();
return await client.PostAsync(serverUri, …Run Code Online (Sandbox Code Playgroud)