在C++/CX中实现异步延迟

Cra*_*ney 5 time interop native callback c++-cx

我正在尝试编写一个函数,在给定的秒数和回调的情况下,在给定的秒数后运行回调.回调不必在同一个线程上.目标语言是C++/CX.

我尝试使用Windows :: System :: Threading :: ThreadPoolTimer,但结果是内存访问异常.问题似乎是无法从计时器正在运行其回调的托管线程访问回调实现(在本机C++中).

ref class TimerDoneCallback {
private:
    function<void(void)> m_callback;
public:
    void EventCallback(ThreadPoolTimer^ timer) {
        m_callback(); // <-- memory exception here
    }
    TimerDoneCallback(function<void(void)> callback) : m_callback(callback) {}
};
void RealTimeDelayCall(const TimeSpan& duration, function<void(void)> callback) {
    auto t = ref new TimerDoneCallback(callback);
    auto e = ref new TimerElapsedHandler(t, &TimerDoneCallback::EventCallback);
    ThreadPoolTimer::CreateTimer(e, duration);
}
void Test() {
    RealTimeDelayCall(duration, [](){}); //after a delay, run 'do nothing'
}
Run Code Online (Sandbox Code Playgroud)

我不想创建一个线程并在其上休眠,因为可能存在许多并发延迟.

And*_*ich 3

TimerDoneCallback 实例不会保持活动状态 - C++/CX 中的委托采用对目标对象的弱引用(以避免循环引用)。您可以使用委托构造函数的扩展重载来覆盖此行为:

auto e = ref new TimerElapsedHandler(t, &TimerDoneCallback::EventCallback, CallbackContext::Any, true);
Run Code Online (Sandbox Code Playgroud)

最后的 bool 参数对于强引用应该为 true,对于弱引用应该为 false。(默认为 False。)

您还可以考虑使用 PPL 代理中的计时器类来进行延迟回调:http://msdn.microsoft.com/en-us/library/hh873170 (v=vs.110).aspx 以避免需要使用 ThreadPoolTimer。