首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#或VB.NET中绑定等价

问在C#或VB.NET中绑定等价
EN

Stack Overflow用户
提问于 2013-04-05 19:13:27
回答 1查看 1.8K关注 0票数 4

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

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

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

代码语言:javascript
复制
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中是否有类似于此的东西?使用代表还是其他什么的?

UPDATE:为了完整起见,下面是基于@lasseespeholt的答案的示例的C#等价物:

代码语言:javascript
复制
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 );
        }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-05 19:25:54

更新:这几乎肯定不会被使用。在C#中使用异步/等待关键字

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

代码语言:javascript
复制
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“的类,这样您就不会用这种方法保存任何东西,但是它是干净的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15841725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档