我在Visual Studio 2012中有这段C#代码。
public Task SwitchLaserAsync(bool on)
{
return Task.Run(new Action(() => SwitchLaser(on)));
}
这将执行类 MyClass
的公共非静态成员方法 SwitchLaser
,并将 bool 类型的参数 on 作为任务执行。
我想在托管的C++/CLI中做类似的事情。但我无法找到任何方法来运行一个任务,该任务将执行一个带有一个参数的成员方法。
当前的解决方案如下:
Task^ MyClass::SwitchLaserAsync( bool on )
{
laserOn = on; //member bool
return Task::Run(gcnew Action(this, &MyClass::SwitchLaserHelper));
}
SwitchLaserHelper函数的实现:
void MyClass::SwitchLaserHelper()
{
SwitchLaser(laserOn);
}
必须有一些类似于C#的解决方案,而不是创建帮助函数和成员(这不是线程安全的)。
Task::Run
需要一个Action
委托。不,Action<T>
不是相同的类型。闭包是使用辅助类实现的。这就是 C# 编译器从你在问题中的示例代码创建的内容,如果管理的 lambda 特性被添加,C++/CLI 编译器将会在未来执行相同的操作。 - Ben Voigt