c++/cli 在任务中使用 IProgress
c++/cli using IProgress in Task
我在 c++/cli 应用程序中使用 Tasks 来管理一些耗时的操作,而没有 freezong UI,作为 BackgroundWorker.This 的替代是基本用法:
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>)
,虽然我不确定这是预期的用途,notevn 试过了,因为我不太确定它是海豚,
我应该将 IProgress
实例添加到我的 WorkArguments
class 吗?
使用 System::Progress<T>
class,一个常备的 IProgress 实现。如果您只想报告进度,您所需要的一切。
它确实缺少手册,如果您不正确使用它,它会出现令人不快的故障模式。第一个要求是您 必须 在 UI 线程上创建 class 的实例,您不能在工作线程中执行此操作。在开始任务之前将其存储在 class 的字段中,以便工作人员可以使用它。必要的,以便它可以确定应该在哪个线程上引发 ProgressChanged 事件。
并且您必须注意不要过于频繁地调用 Report()。将它限制在每 ~50 毫秒不超过一次,给予或接受。以高速率调用它(每秒超过 1000 次)将触发 UI 线程并导致它停止更新 UI 和响应输入。当仅在报告的进度值实际发生变化且进度范围有限(如 0-100%)时才调用它通常很容易避免。
我在 c++/cli 应用程序中使用 Tasks 来管理一些耗时的操作,而没有 freezong UI,作为 BackgroundWorker.This 的替代是基本用法:
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>)
,虽然我不确定这是预期的用途,notevn 试过了,因为我不太确定它是海豚,
我应该将 IProgress
实例添加到我的 WorkArguments
class 吗?
使用 System::Progress<T>
class,一个常备的 IProgress 实现。如果您只想报告进度,您所需要的一切。
它确实缺少手册,如果您不正确使用它,它会出现令人不快的故障模式。第一个要求是您 必须 在 UI 线程上创建 class 的实例,您不能在工作线程中执行此操作。在开始任务之前将其存储在 class 的字段中,以便工作人员可以使用它。必要的,以便它可以确定应该在哪个线程上引发 ProgressChanged 事件。
并且您必须注意不要过于频繁地调用 Report()。将它限制在每 ~50 毫秒不超过一次,给予或接受。以高速率调用它(每秒超过 1000 次)将触发 UI 线程并导致它停止更新 UI 和响应输入。当仅在报告的进度值实际发生变化且进度范围有限(如 0-100%)时才调用它通常很容易避免。