我對 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();
}
可能需要補充一點,被呼叫的“方法”方法本身不是異步的。
我還查看了此頁面上的第一個示例,它說 Task<(T)> 本身是異步的。似乎也沒有使用 await 關鍵字: https ://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.task-1?view=net-6.0
該示例會重現上述代碼的功能嗎?
uj5u.com熱心網友回復:
如果我的快速谷歌搜索是正確的,那么launch::deferred意味著對呼叫執行緒的延遲評估。
在這種情況下,使用任務可能不是一個好主意,它們不適合惰性評估,因為:
- 如果它們尚未啟動,則等待它們或獲取它們的結果不會啟動它們(并且在它們已經運行時啟動它們會引發例外)
- 您不能在呼叫執行緒上運行它們,它們代表異步操作(例如 IO)或在 ThreadPool 執行緒上運行的作業
- 即使您可以在呼叫執行緒上運行它們(如果它們尚未啟動),它們通常是使用創建的,
Task.Run()或者Task.Factory.StartNew()立即啟動它們
也許你可以System.Lazy<T>改用。它似乎可以滿足您的需求,包括幾個執行緒安全選項。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/462305.html
上一篇:推送到異步映射中的陣列
