我想学习如何async和let!工作在F#.我读过的所有文档都让人感到困惑.使用Async.RunSynchron运行异步块有什么意义?这是异步还是同步?看起来像是一个矛盾.
文档说Async.StartImmediate在当前线程中运行.如果它在同一个线程中运行,它对我来说看起来并不是异步......或者asyncs更像是协程而不是线程.如果是这样的话,他们什么时候退回?
引用MS文档:
使用let的代码行!开始计算,然后暂停线程直到结果可用,此时执行继续.
如果线程等待结果,我为什么要使用它?看起来像普通的旧函数调用.
Async.Parallel有什么作用?它接收一系列Async <'T>.为什么不能并行执行一系列普通函数?
我想我在这里缺少一些非常基本的东西.我想在我理解之后,所有文档和样本都将开始有意义.
When you are debugging, it's very useful to do this:
var = calc()
print("var:", var)
Run Code Online (Sandbox Code Playgroud)
Is there any language where this is easy to do? In C and C++ you can use the stringify macro operator # and in Ruby I found this question:
使用符号:var和块的解决方案就是我想要的.
在D中,我使用了这个:
void trace(alias msg)() {
writeln(msg.stringof ~ ":" ~ to!string(msg));
}
Run Code Online (Sandbox Code Playgroud)
但我不确定这是最好的方法,因为它只适用于简单的情况.我尝试了几种方法,但有时你可以得到字符串,但不是值(因为变量超出范围),或者你必须首先混合模板然后调用函数.
那么其他语言呢?蟒蛇?F#?嘘?Shell脚本(无论哪个shell)?Perl的?(我更喜欢远离Perl,tho).TCL?Lisp,Scheme?Java的?(Java不太可能这样做).
即使在我找到某种解决方案的语言中,它也适用于简单的情况.如果我想要打印任意表达式怎么办?
如果我正在设计一种语言,这个功能将是必备的.:-)
我打算为EJB编写拦截器,它基本上会做以下事情:
@AroundInvoke
public Object setContext(InvocationContext ctx) throws Exception {
em.createQuery("... set something [database specific] ...").getSingleResult();
try {
return ctx.proceed();
} finally {
em.flush();
em.createQuery("... unset something [database specific] ...").getSingleResult();
}
}
Run Code Online (Sandbox Code Playgroud)
问题是如果将em.flush()应用于使用@TransactionAttribute(NOT_SUPPORTED)或@TransactionAttribute(SUPPORTS)(即只读方法)注释的方法,则会抛出异常,而使用默认@的方法可以正常工作TransactionAttribute(REQUIRED)(即更改数据库的方法).
有没有办法判断一个事务是否处于活动状态,以避免在当前没有事务正在运行时调用em.flush(),或者我必须创建两个拦截器,一个是em.flush(),一个是没有它?
我无法注入UserTransaction,因为bean使用容器管理的事务.EntityManager的(em)事务方法仅适用于resource_local事务,而不适用于JTA事务.我需要em.flush()调用以确保unset查询是最后运行的东西.
作为奖金问题,有谁知道我想做什么是某种不良做法?我知道拦截器在与bean相同的上下文中运行,因此通过数据库会话分享内容是安全的,但我必须非常小心在退出时取消设置所有内容,因为连接是在容器中汇集的.