gpt4 book ai didi

c# - C# 或 VB.NET 中的 std::bind 等价物

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:03:42 25 4
gpt4 key购买 nike

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

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

在 C++ 中,我使用 std::bind 来解决这个问题。我只是将与回调处理程序所需的局部变量一样多的参数添加到回调处理程序中,并在调用异步方法时绑定(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 中是否有某种等价物?使用委托(delegate)或其他方式?

更新:为了完整起见,这里是基于@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# 或 VB.NET 中的 std::bind 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15841725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com