有没有办法在仍在处理事件的同时暂停执行 UWP 控制台应用程序的主线程?

Is there a way to pause execution a UWP console app's main thread while still handling events?

我正在制作事件驱动的应用程序原型(目前为 UWP 控制台应用程序)。该应用程序对系统上新创建的文件进行操作,我正在使用 StorageFileQueryResult.ContentsChanged 来监视它们,但我不确定在等待事件时我应该做什么来保持进程的活动。我目前正在使用无限 while 循环(有效)。当然,必须有更好的方法吗?

我正在使用 c++/winrt,但任何通用的 UWP 解决方案都适用。

示例代码如下:

int main()
{
    winrt::init_apartment();

    Windows::Storage::StorageFolder folder{ Windows::Storage::StorageFolder::GetFolderFromPathAsync(SOME_PATH).get() };
    auto queryOptions = Windows::Storage::Search::QueryOptions(Windows::Storage::Search::CommonFileQuery::DefaultQuery, NULL);
    auto query = folder.CreateFileQueryWithOptions(queryOptions);
    query.ContentsChanged(Query_ContentsChanged);
    
    auto files = query.GetFilesAsync().get();
    for (auto const& f : files) {
        std::wcout << f.Name().c_str() << std::endl;
    }

    while (1) {} // Keep process alive
}

通常,您可以使用 getchar()system("pause") 来阻塞控制台线程。

您可以使用的另一种方式是锁定,请检查以下代码:

#include <iostream>
#include <condition_variable>
#include <mutex>

std::condition_variable cv;
std::mutex mtx;

int main()
{
    winrt::init_apartment();

    std::unique_lock<std::mutex> m(mtx);

    Windows::Storage::StorageFolder folder{ Windows::Storage::StorageFolder::GetFolderFromPathAsync(L"C:\test1").get() };
    auto queryOptions = Windows::Storage::Search::QueryOptions(Windows::Storage::Search::CommonFileQuery::DefaultQuery, NULL);
    auto query = folder.CreateFileQueryWithOptions(queryOptions);
    query.ContentsChanged(Query_ContentsChanged);

    auto files = query.GetFilesAsync().get();

    cv.wait(m);
    //getchar();
    //system("pause");

}