.net c++/在任务中使用IProgress的cli

.net c++/在任务中使用IProgress的cli,.net,c++-cli,.net,C++ Cli,我正在使用c++/cli应用程序中的任务来管理一些耗时的操作,而不使用UI来替代BackgroundWorker。这是基本用法: WorkArguments ^arguments = gcnew WorkArguments( //some argument objects as contructor parameters ); Task::Factory->StartNew(gcnew Action<Object^>(this, &myForm::doS

我正在使用c++/cli应用程序中的任务来管理一些耗时的操作,而不使用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
}
WorkArguments^arguments=gcnewworkarguments(
//一些参数对象作为构造函数参数
);
Task::Factory->StartNew(gcnewaction(this,&myForm::doSomeWork),参数);
void myForm::doSomeWork(对象^arguments){
//做一些事情
}
到目前为止,一切顺利。我现在的问题是,我不知道如何使用IProgress界面将已完成工作的报告返回到我的UI。我找不到方法来声明与获取IPProcess对象的StartNew()兼容的委托

我发现最接近的一件事是,虽然我不确定这是否是预期用途,但我试过了,因为我不太确定它的用途

我是否应该将
IProgress
实例添加到我的
WorkArguments
类中?

使用IProgress的库存实现。如果你只想报告进度,你所需要的一切

它确实缺少一本手册,如果你没有正确使用它,它会有令人不快的故障模式。第一个要求是必须在UI线程上创建类的实例,而不能在工作线程中创建。在开始任务之前,将其存储在类的字段中,以便工作人员可以使用它。必要时,它可以确定应该在哪个线程上引发ProgressChanged事件

您必须小心不要太频繁地调用Report()。将其限制为每~50毫秒不超过一次。以高速率调用它(每秒超过1000次)将触发UI线程,并导致它停止更新UI和响应输入。当您仅在报告的进度值实际更改且进度范围有限(如0-100%)时调用它时,通常很容易避免