【发布时间】:2013-04-05 19:13:27
【问题描述】:
我正在将“同步”代码(即使用 Windows 事件等到其他线程完成某事)重构为“异步”代码(使用委托来实现回调机制)。
在同步代码中,有时我需要在等待结束后使用局部变量。当这样的代码异步时,那些局部变量会丢失(回调处理程序无法访问它们)。我可以将它们存储为类属性,但感觉很浪费。
在 C++ 中,我使用 std::bind 来解决这个问题。我只是将尽可能多的参数添加到回调处理程序所需的局部变量,并在我调用异步方法时绑定它们。例如,假设异步方法回调接收CallbackParam 类型的对象,调用者使用LocalA 和LocalB 类型的两个局部变量。
void AsyncClass::MethodWhichCallsAsyncMethod(){
LocalA localVarA;
LocalB localVarB;
// OnAsyncMethodDone will need localVarA and localVarB, so we bind them
AsyncMethod( std::bind( &AsyncClass::OnAsyncMethodDone, this, std::placeholders::_1, localVarA, localVarB ) );
}
void AsynClass::AsyncMethod( std::function<void(CallbackParam)> callback ){
CallbackParam result;
//Compute result...
if( callback )
callback( result );
}
void AsyncClass::OnAsyncMethodDone( CallbackParam p, LocalA a, LocalB b ){
//Do whatever needs to be done
}
在 C# 和 VB.NET 中是否有某种等价物?使用委托或其他方式?
更新:为了完整起见,这里是基于@lasseespeholt 回答的我的示例的 C# 等效项:
using System;
public class AsyncClass {
public void MethodWhichCallsAsyncMethod() {
var a = new LocalA();
var b = new LocalB();
//Anonymous callback handler (equivalent to AsyncClass::OnAsyncMethodDone)
Action<CallbackParam> callback = result => {
//Do what needs to be done; result, a and b can be accessed
};
AsyncMethod( callback );
}
private void AsyncMethod( Action<CallbackParam> callback ) {
var result = new CallbackParam();
//Compute result...
if( callback != null )
callback( result );
}
}
【问题讨论】:
标签: c# c++ vb.net .net-4.0 stdbind