在C#或VB.NET中的std :: bind等价物
作者:互联网
我正在重构“同步”代码(即使用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#中使用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”的类,所以你不用这种方法保存任何东西,但它很干净.
标签:c,c-2,vb-net,net-4-0,stdbind 来源: https://codeday.me/bug/20190629/1327958.html