C# 等效于 C++ 延迟异步执行?

C# equivalent of C++ deferred async execution?

我对 C# 比较陌生,我正在尝试复制一个已经用 C++ 编写的异步调用。这有点困难,因为虽然我可以轻松理解 C# 中的 async/await 关键字,但我仍然坚持使用该语言的延迟启动概念。原代码如下:

bool runMethod(const cv::Mat& param1,
             float& param2,
             std::pair<float, float>& param3,
             std::pair<int, int>& param4)
{
   auto async_lazy{ std::async(std::launch::deferred,
    [&param1, &param2, &param3, &param4]
    {
        const MyClass ret{ MyClass::getInstance()->Method(param1};

        if (ret.status)
        {
            //Do work...
        }

        return ret.status;
    }) };

    return async_lazy.get();
}

可能需要补充一点,被调用的“Method”方法本身不是异步的。

我还查看了此页面上的第一个示例,它说 Task<(T)> 本身是异步的。似乎也没有使用 await 关键字: https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.task-1?view=net-6.0

该示例能否重现上述代码的功能?

如果我的快速 google 搜索是正确的,那么 launch::deferred 意味着调用线程上的惰性计算。

在那种情况下,使用任务可能不是一个好主意,它们不适合惰性评估,因为:

  • 等待他们或获取他们的结果不会启动他们,如果他们是 尚未启动(在它们已经启动时启动它们 运行ning 抛出异常)
  • 你不能在调用线程上 运行 它们,它们代表异步操作(例如 IO)或在 ThreadPool 线程上工作 运行ning
  • 即使您可以在调用线程上 运行 它们(如果它们尚未启动),它们通常是使用 Task.Run()Task.Factory.StartNew() 创建的,这会立即启动它们

也许您可以改用 System.Lazy<T>。它似乎可以满足您的需求,包括几个线程安全选项。