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,
[¶m1, ¶m2, ¶m3, ¶m4]
{
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>
。它似乎可以满足您的需求,包括几个线程安全选项。
我对 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,
[¶m1, ¶m2, ¶m3, ¶m4]
{
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>
。它似乎可以满足您的需求,包括几个线程安全选项。