我在c ++ / cli应用程序中使用Tasks来管理一些耗时的操作,而不会冻结UI,作为BackgroundWorker的替代。这是基本用法:
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接口将完成的工作报告提供给我的UI。我找不到声明与获取IProcess对象的StartNew()兼容的委托的方法。
我发现的最接近的事情是AsyncInfo::Run<TProgress> Method (Func<CancellationToken, IProgress<TProgress>, Task>)
,但是我不确定这是否是预期的用途,请注意,因为我不太确定它是什么&#39; s porpouse,
我应该将IProgress
个实例添加到我的WorkArguments
课程吗?
答案 0 :(得分:3)
使用System::Progress<T>
class,IProgress的股票实施。如果您只想报告进度,那就是您所需要的一切。
它确实缺少手册,如果您没有正确使用它,它会有令人不快的故障模式。第一个要求是必须在UI线程上创建类的实例,而不能在工作线程中执行。在开始任务之前将其存储在类的字段中,以便工作人员可以使用它。这是必要的,因此它可以找出应该引发ProgressChanged事件的线程。
你必须小心不要经常调用Report()。限制为每50毫秒不超过一次,给予或采取。以高速率(每秒超过1000次)调用它将触发UI线程并使其停止更新UI并响应输入。当您仅在报告的进度值实际发生变化且进度范围有限(如0-100%)时调用它时,通常很容易避免。