簡體   English   中英

任務並行庫 Task.ContinueWith 使用 C++/CLI

[英]Task Parallel Library Task.ContinueWith using C++/CLI

我已經開始在我的 C++/CLI 項目中使用任務並行庫 (TPL)。 這在運行可以獨立運行的簡單任務時效果很好。 我正在編寫的軟件能夠檢查服務器上的更新。 這以前是在主線程上完成的,但這使得 GUI 在檢查期間凍結,這確實沒有給用戶留下對軟件的好印象。

因此,我測試了使用 TPL 運行檢查。 我可以開始檢查更新(按照Using .NET (3.5) Task Parallel Library in C++/CLI 中的指示),如下所示:

Void SoftwareUpdateChecker::RunCheck(Boolean automatic)
{
    Task<Boolean>^ versionCheckTask = Task<Boolean>::Factory->StartNew( gcnew Func<Boolean>(this, &SoftwareUpdateChecker::IsUpdateAvailable) );

    // This line is the problem, this freezes the main thread...
    versionCheckTask->Wait();

    Boolean isNewerVersionOnServer = versionCheckTask->Result;

    if(isNewerVersionOnServer)
    {
        QueryUserToDownloadNewVersion();
    }
}

TPL 有一個很好的特性,它可以使用 Task.ContinueWith(...) 定義任務的順序,如任務鏈(等待上一個任務完成)中所述 我想做的是(在 C# 中):

Task.Factory.StartNew( () => IsUpdateAvailable())
   .ContinueWith(() => OnVersionCheckDone(antecendent.Result), 
       TaskScheduler.FromCurrentSynchronizationContext());

如果確實有新版本可用, OnVersionCheckDone(bool) 可以負責詢問用戶如何繼續。 有關如何執行此操作的所有示例都是用 C# 編寫的,但我無法將其轉換為 C++/CLI。

這是可能嗎 ?

雖然 C++ 不支持托管 lambdas,但您可以做一些小動作來讓委托工作,並在必要時覆蓋您自己的變量。 在這種情況下,ContinueWith 委托將 Task 作為參數,因此我們不必做太多事情。

Void SoftwareUpdateChecker::RunCheck(Boolean automatic)
{
    Task<Boolean>^ versionCheckTask = Task<Boolean>::Factory->StartNew( gcnew Func<Boolean>(this, &SoftwareUpdateChecker::IsUpdateAvailable) );
    versionCheckTask->ContinueWith(gcnew Action<Task<Boolean>^>(this, &SoftwareUpdateChecker::OnVersionCheckDone), TaskScheduler::FromCurrentSynchronizationContext());
}

Void SoftwareUpdateChecker::OnVersionCheckDone(Task<Boolean>^ versionCheckTask)
{
    if(versionCheckTask->Result) QueryUserToDownloadNewVersion();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM