std::bind在c#或VB.NET中的等价
std::bind equivalent in C# or VB.NET
我正在将"同步"代码(即使用Windows事件等待其他线程完成某事)重构为"异步"代码(使用委托实现回调机制)。
在同步代码中,有时需要在等待结束后使用局部变量。当这样的代码变为异步时,这些局部变量将丢失(回调处理程序无法访问它们)。我可以将它们存储为类属性,但感觉很浪费。
在c++中,我使用std::bind
来解决这个问题。我只是向回调处理程序添加了所需的尽可能多的参数和局部变量,并在调用async方法时绑定它们。例如,假设异步方法回调接收到类型为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中是否有类似的东西?使用委托还是其他方法?
UPDATE:为了完整起见,下面是基于@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 );
}
}
UPDATE:这几乎肯定不应该使用。在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"的类,所以你不用用这种方法保存任何东西,但它很干净。
相关文章:
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 在 C++/CLI 中将 .NET 事件从一个 DLL 引发到另一个 DLL
- 如何在 64 位 vb.net Windows 应用程序中引用 32 位 dll
- 加载与引用 .NET DLL 位于同一文件夹中的引用的 .NET DLL 时"Not found"异常
- boost::bind()类似的东西,但用于函数调用
- 使用 std::应用于 std::bind
- 是否可以在Linux上使用.Net Core 3.1创建C++/CLI代码的C#DLL
- PCL:当我在setConditionFunction中使用std::bind 时,没有合适的转换函数
- Poco::Net::FTPClientSession 在 open() 方法上挂起 129 秒,如果 ftp 主机不存
- std::bind on statd::array 的运算符 []
- std::bind c++ in if statement
- C++ DLL(不是 CLI)是否可以调用 .NET Core 3.0 委托?
- System.AccessViolationException:shared_ptr C# .NET 和 C++ 应用程
- std::bind 是否实现了 std::ref 和 std::cref 来消除函数调用的歧义?
- C++/CLI targetting .NET Core 3.1
- C++ 事件管理器的回调,使用 std::function 和 std:bind 以及派生类作为参数
- 试图克服 std::bind 编译错误
- c++ std::bind within function
- std::bind to void* to std::function
- std::bind在c#或VB.NET中的等价