std::C#或VB.NET中的绑定等效项

std::C#或VB.NET中的绑定等效项,c#,c++,vb.net,.net-4.0,stdbind,C#,C++,Vb.net,.net 4.0,Stdbind,我正在将“同步”代码(即使用Windows事件等待其他线程完成某些操作)重构为“异步”代码(使用委托实现回调机制) 在同步代码中,我有时需要在等待结束后使用局部变量。当这样的代码变为异步时,这些局部变量将丢失(回调处理程序无法访问它们)。我可以将它们存储为类属性,但这感觉很浪费 在C++中,我使用 STD::Buff< /Cord>来解决这个问题。我只需向回调处理程序添加尽可能多的本地变量参数,并在调用异步方法时绑定它们。例如,假设异步方法回调接收类型为CallbackParam的对象,调用方使

我正在将“同步”代码(即使用Windows事件等待其他线程完成某些操作)重构为“异步”代码(使用委托实现回调机制)

在同步代码中,我有时需要在等待结束后使用局部变量。当这样的代码变为异步时,这些局部变量将丢失(回调处理程序无法访问它们)。我可以将它们存储为类属性,但这感觉很浪费

<>在C++中,我使用<代码> STD::Buff< /Cord>来解决这个问题。我只需向回调处理程序添加尽可能多的本地变量参数,并在调用异步方法时绑定它们。例如,假设异步方法回调接收类型为
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
}
void AsyncClass::MethodWhichCallsAsyncMethod(){
LocalA localVarA;
LocalB localVarB;
//OnAsyncMethodDone将需要localVarA和localVarB,因此我们将它们绑定
AsyncMethod(std::bind(&AsyncClass::OnAsyncMethodDone,this,std::占位符::\u 1,localVarA,localVarB));
}
void AsyncClass::AsyncMethod(std::函数回调){
CallbackParam结果;
//计算结果。。。
如果(回调)
回调(结果);
}
void AsyncClass::OnAsyncMethodDone(CallbackParam p、LocalA a、LocalB){
//做任何需要做的事
}
在C#和VB.NET中有类似的东西吗?使用代理还是其他什么

更新:为了完整起见,下面是基于@lassespeholt的答案的我的示例的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 );
        }
}
使用系统;
公共类异步类{
调用sasyncmethod()的公共无效方法{
var a=新的LocalA();
var b=新的LocalB();
//匿名回调处理程序(相当于AsyncClass::OnAsyncMethodDone)
操作回调=结果=>{
//做需要做的事情;结果a和b可以访问
};
异步方法(回调);
}
私有void异步方法(操作回调){
var result=newcallbackparam();
//计算结果。。。
if(回调!=null)
回调(结果);
}
}

更新:这几乎肯定不会被使用。使用C#

您可以像下面这样利用闭包:

void MethodWhichCallsAsyncMethod()
{
    int foo = 1;

    AsyncCallback callback = result =>
    {
        Console.WriteLine(foo); // Access to foo
    };

    AsyncMethod(callback);
}

void AsyncMethod(AsyncCallback callback)
{
    IAsyncResult result = null; // Compute result
    callback(result);
}

编译器生成了一个包含“foo”的类,因此您不需要使用这种方法保存任何内容,但它是干净的。

看起来不错;我不愿意将状态添加到我的类中,但是如果编译器这样做了,我不介意:P这也可以在VB.NET中完成吗?(我们谈论的是.NET4.0)@dario_ramos我自己不使用VB.NET,但使用的是。C#和VB.Net共享大多数功能。此页面应帮助您在VB.Net中使用lambdas: