我有这个代码,如果它们上面有“Asynch”注释,它允许在一个单独的线程中执行函数。一切正常,除了我意识到我还必须处理我刚刚添加的一些新功能的返回值的那一天。我可以使用处理程序和消息传递,但是,由于已经构建的项目结构(这是巨大的,工作正常),我无法更改现有的函数来处理消息传递。
以下是代码:
/**
* Defining the Asynch interface
*/
@Retention(RetentionPolicy.RUNTIME)
public @interface Asynch {}
/**
* Implementation of the Asynch interface. Every method in our controllers
* goes through this interceptor. If the Asynch annotation is present,
* this implementation invokes a new Thread to execute the method. Simple!
*/
public class AsynchInterceptor implements MethodInterceptor {
public Object invoke(final MethodInvocation invocation) throws Throwable {
Method method = invocation.getMethod();
Annotation[] declaredAnnotations = method.getDeclaredAnnotations();
if(declaredAnnotations != null && declaredAnnotations.length > 0) {
for (Annotation annotation : declaredAnnotations) {
if(annotation instanceof Asynch) {
//start the requested task in a new thread and immediately
//return back control to the caller
new Thread(invocation.getMethod().getName()) {
public void execute() {
invocation.proceed();
}
}.start();
return null;
}
}
}
return invocation.proceed();
}
}
现在,我如何将其转换为如果它的东西为:
@Asynch
public MyClass getFeedback(int clientId){
}
MyClass mResult = getFeedback(12345);
“mResult”会使用返回的值进行更新吗?
提前完成了......
答案 0 :(得分:2)
你不能,从根本上说。 getFeedback
必须以同步方式返回某些 - 而在某些情况下,您可以稍后更新返回的对象,在其他情况下,您显然无法 - 像String
这样的不可变类是很明显的例子。你以后不能改变变量 mResult
的值......毕竟它很可能是一个局部变量。实际上,到计算结果的时候,使用它的方法可能已经完成......使用虚假值。
只需在同步语言之上添加注释,就无法获得干净的异步性。理想情况下,异步操作应返回类似Future<T>
之类的内容,以便“稍后会出现结果” - 以及查找结果的方式,是否已计算,是否有一个异常等等。这就是为什么在C#5中添加async/await
的原因 - 因为你不能在库级透明地执行它,即使使用AOP也是如此。编写异步代码应该是一个非常慎重的决定 - 而不仅仅是通过注释固定到同步代码上的东西。