【问题标题】:std::bind equivalent in C# or VB.NETC# 或 VB.NET 中的 std::bind 等效项
【发布时间】:2013-04-05 19:13:27
【问题描述】:

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

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

在 C++ 中,我使用 std::bind 来解决这个问题。我只是将尽可能多的参数添加到回调处理程序所需的局部变量,并在我调用异步方法时绑定它们。例如,假设异步方法回调接收CallbackParam 类型的对象,调用者使用LocalALocalB 类型的两个局部变量。

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


    【解决方案1】:

    更新:这几乎肯定不应该使用。在 C# 中使用 async/await 关键字

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

    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 中完成吗? (我们说的是 .NET 4.0)
    • @dario_ramos 我自己不使用 VB.Net,但是可以。 C# 和 VB.Net 共享大多数功能。此页面应该可以帮助您在 VB.Net 中使用 lambda:msdn.microsoft.com/en-us/library/bb531253.aspx
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 2016-04-25
    • 1970-01-01
    • 2016-02-12
    相关资源
    最近更新 更多