C ++相当于.NET的Task.Delay?

时间:2012-12-10 18:19:41

标签: task wait windows-store-apps c++-cx

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

4 个答案:

答案 0 :(得分:2)

旧问题,但仍然没有答案。

您可以使用

#include <chrono>
#include <thread>


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

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

答案 1 :(得分:0)

我不会声称自己是一名巫师 - 我对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;
}

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

  1. 它是非阻塞的
  2. 您可以保证在XAML UI线程上回调

答案 2 :(得分:0)

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

This link(来自Visual C ++ Parallel Patterns Library文档)包含一个名为complete_after()的函数的片段。该函数创建一个在指定的毫秒数后完成的任务。然后,您可以定义将在之后执行的继续任务:

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.
}

答案 3 :(得分:-1)

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