Tôi đang viết một thành phần C++/CX để được Ứng dụng cửa hàng của Window sử dụng. Tôi đang tìm một cách để thực hiện những gì Task.Delay (1000) làm trong C#.C++ tương đương với Task.Delay của .NET?
Trả lời
Bạn có thể tạo đồng thời :: tác vụ, đợi 1000 đơn vị thời gian và sau đó gọi phương thức ".then" cho tác vụ. Điều này sẽ đảm bảo rằng có ít nhất một sự chờ đợi của 1000 đơn vị thời gian giữa thời gian bạn tạo ra nhiệm vụ và giữa thời gian nó được thực hiện.
Câu hỏi cũ nhưng vẫn chưa được trả lời.
Bạn có thể sử dụng
#include <chrono>
#include <thread>
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
này sẽ cần C++11, mà không phải là một vấn đề khi sử dụng C++/CX.
Ngủ và được lên kế hoạch sau đó không thực sự giống nhau. – sturcotte06
Tôi sẽ không để tự xưng là một phù thủy - Tôi vẫn còn khá mới để UWP và C++/CX, nhưng những gì tôi đang sử dụng như sau:
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;
}
Ưu điểm chính. qua các phương pháp khác là:
- đó là non-blocking
- Bạn sẽ được bảo đảm để được gọi trở lại vào thread XAML UI
Sau một năm sử dụng C++/CX, tôi có câu trả lời chung và hợp lý cho câu hỏi này.
This link (từ tài liệu Thư viện mẫu song song Visual C++) bao gồm một đoạn mã cho hàm gọi là complete_after(). Hàm đó tạo một tác vụ sẽ hoàn thành sau số mili giây được chỉ định. Sau đó bạn có thể xác định một nhiệm vụ tiếp tục mà sẽ thực hiện sau:
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.
});
}
Hoặc tốt hơn, nếu bạn sử dụng Visual C++ 's coroutines khả năng chỉ cần gõ:
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.
}
Đó là một câu hỏi có tính chu kỳ, một lần trong nhiệm vụ, làm thế nào bạn có đợi không –
:: WaitForSingleObjectEx (:: GetCurrentThread(), mili giây, FALSE); –