我一直在使用 Progress<T>
,想知道它是否可以被 Action<T>
替换。
在下面的代码中,使用它们来报告进度,即 ReportWithProgress()
或 ReportWithAction()
,对我来说没有任何明显的区别。如何增加 progressBar1
,如何在输出窗口中写入字符串,它们看起来都是相同的。
// WinForm application with progressBar1
private void HeavyIO()
{
Thread.Sleep(20); // assume heavy IO
}
private async Task ReportWithProgress()
{
IProgress<int> p = new Progress<int>(i => progressBar1.Value = i);
for (int i = 0; i <= 100; i++)
{
await Task.Run(() => HeavyIO());
Console.WriteLine("Progress : " + i);
p.Report(i);
}
}
private async Task ReportWithAction()
{
var a = new Action<int>(i => progressBar1.Value = i);
for (int i = 0; i <= 100; i++)
{
await Task.Run(() => HeavyIO());
Console.WriteLine("Action : " + i);
a(i);
}
}
但是Progress<T>
不能是重复造轮子。它被实现的原因应该是有道理的。谷歌搜索“c# Progress vs Action”并没有给我太多帮助。进度与操作有何不同?
HeavyIO
更改为async Task HeavyIO() { await Task.Delay(20); }
,这样至少你会调用一个任务。 - Camilo TerevintoProgress<T>
会在构造时所处的上下文中调用该操作,这使您可以与UI交互而不需要繁琐的调用代码。 - DavidGProgress
的文档中找到了什么信息,它为什么无法回答你的问题? - ServyprogressBar1.Value = i
会导致可怕的 "跨线程操作无效" 异常。 - vgruProgress<T>
是一个类,而Action<T>
仅仅是一个委托。 - Matthew Watson