2015-07-21 30 views
1

使用IProgress我使用任務在C++/CLI應用程序來管理一段時間沒有freezong的UI耗時的操作,作爲替換對BackgroundWorker.This的基本用法:C++/CLI在任務

WorkArguments ^arguments = gcnew WorkArguments(
     //some argument objects as contructor parameters 
); 
Task::Factory->StartNew(gcnew Action<Object^>(this, &myForm::doSomeWork), arguments);   

void myForm::doSomeWork(Object ^arguments) { 
//doing some stuff 
} 

到目前爲止,這麼好。我現在的問題是,我無法弄清楚如何向我們提供IProgress接口,以便將完成的工作報告返回給我的用戶界面。我無法找到聲明與獲取IProcess對象的StartNew()兼容的委託的方式。

我發現的最接近的是AsyncInfo::Run<TProgress> Method (Func<CancellationToken, IProgress<TProgress>, Task>),althogh我不知道這是否是預期USAE,notevn嘗試它,因爲我不是很肯定這是porpouse,

我應該添加IProgress實例我的WorkArguments課?

回答

3

使用System::Progress<T> class是IProgress的庫存實施。如果您只想報告進度,您只需要這麼做。

它確實有一個丟失的手冊,如果您沒有正確使用它,它會有不愉快的故障模式。首先要求你必須在UI線程上創建類的一個實例,你不能在工作線程中做到這一點。在開始任務之前將其存儲在班級的一個字段中,以便工作人員可以使用它。必要的是,它可以找出ProgressChanged事件應該引發到哪個線程上。

而且你必須小心不要經常調用Report()。限制它不超過每50毫秒一次,給予或服用。以較高的速度調用(每秒超過1000次)會觸發UI線程並導致其停止更新UI並響應輸入。當報告的進度值實際發生變化並且進度範圍有限(如0-100%)時,通常只需調用它就很容易避免。