.NET 的 Task.Delay 的 C++ 等价物?

Posted

技术标签:

【中文标题】.NET 的 Task.Delay 的 C++ 等价物?【英文标题】:C++ equivalent of .NET's Task.Delay? 【发布时间】:2012-11-28 05:05:34 【问题描述】:

我正在编写一个 C++/CX 组件,供 Window 的商店应用程序使用。我正在寻找一种方法来完成 Task.Delay(1000) 在 C# 中所做的事情。

【问题讨论】:

【参考方案1】:

老问题,但仍未得到解答。

你可以使用

#include <chrono>
#include <thread>


std::this_thread::sleep_for(std::chrono::milliseconds(1000));

这将需要C++11,这在使用 C++/CX 时应该不是问题。

【讨论】:

睡觉和稍后安排时间并不是一回事。【参考方案2】:

在使用 C++/CX 一年之后,我对这个问题有了一个普遍且合理正确的答案。

This link(来自 Visual C++ 并行模式库文档)包含一个用于名为 complete_after() 的函数的 sn-p。该函数创建一个将在指定的毫秒数后完成的任务。然后,您可以定义一个随后将执行的延续任务:

void MyFunction()

    // ... Do a first thing ...

    concurrency::create_task(complete_after(1000), concurrency::task_continuation_context::use_current)
    .then([]() 
        // Do the next thing, on the same thread.
    );

或者更好的是,如果您使用 Visual C++ 的 coroutines 功能,只需键入:

concurrency::task<void> MyFunctionAsync()

    // ... Do a first thing ...

    co_await complete_after(1000);
    // Do the next thing.
    // Warning: if not on the UI thread (e.g., on a threadpool thread), this may resume on a different thread.

【讨论】:

协程代码给了我:“这个 co_await 表达式需要一个合适的“await_ready”函数,但没有找到”:/ Felix - 为了让协程工作,调用函数需要有一个 concurrency::task 返回类型。如果调用函数的返回类型为 void,您会收到该消息。 我现在看到甚至还有一个 concurrency::wait(ms) 函数,它可以用于更简单的 complete_after() 实现。 docs.microsoft.com/en-us/cpp/parallel/concrt/reference/… 嗯,我以为我已经将返回类型更改为 concurrency::task&lt;void&gt; :/ 哦,concurrency::wait(ms) 看起来很有希望 :)【参考方案3】:

您可以创建一个 concurrency::task,等待 1000 个时间单位,然后为该任务调用“.then”方法。这将确保在您创建任务和执行任务之间至少有 1000 个时间单位的等待。

【讨论】:

这是一个循环问题,一旦进入任务,你怎么等?? ::WaitForSingleObjectEx(::GetCurrentThread(), 毫秒, FALSE); Luc Bloom 的解决方案很好。我没有意识到 UWP 应用程序仍然允许 Win32 API,但它是。【参考方案4】:

我不会声称自己是个巫师——我对 UWP 和 C++/CX 还是很陌生,但我使用的是以下内容:

public ref class MyClass sealed 
public:
    MyClass()
    
        m_timer = ref new Windows::UI::Xaml::DispatcherTimer;
        m_timer->Tick += ref new Windows::Foundation::EventHandler<Platform::Object^>(this, &MyClass::PostDelay);
    
    void StartDelay()
    
        m_timer->Interval.Duration = 200 * 10000;// 200ms expressed in 100s of nanoseconds
        m_timer->Start();
    
    void PostDelay(Platform::Object^ sender, Platform::Object ^args)
    
        m_timer->Stop();
        // Do some stuff after the delay
    
private:
    Windows::UI::Xaml::DispatcherTimer ^m_timer;

与其他方法相比的主要优势在于:

    它是非阻塞的 您一定会在 XAML UI 线程上被回调

【讨论】:

以上是关于.NET 的 Task.Delay 的 C++ 等价物?的主要内容,如果未能解决你的问题,请参考以下文章

等待 Task.Delay() 与 Task.Delay().Wait()

C#中的Task.Delay()和Thread.Sleep()区别

celery task调用

Thread.Sleep(2500) 与 Task.Delay(2500).Wait()

何时使用Task.Delay,何时使用Thread.Sleep?

为啥 scheduleAtFixedRate(task, delay, period) 不能按计划工作?