我注意到以下行为.IProgress填充控制台输出消息时,它们会显示在错误的文件夹中.
var recounter = new IdRecounter(filePath, new Progress<string>(Console.WriteLine));
recounter.RecalculateIds();
Run Code Online (Sandbox Code Playgroud)
我正在努力提高我的封装,可重用性和设计技巧.所以,我有一个名为IdRecounter的类.我现在想在控制台应用程序中使用它,但稍后可能在WPF应用程序中使用它.
因此,我希望班级完全不知道它的环境 - 但同时我想报告"现场"行动的进展 - 因此,我使用IProgress类型,这将允许我将东西放入控制台,或者进入日志文件,或更新状态标签属性等.(如果不是这样的话,请告诉我)
因此,我注意到它倾向于以不正确的顺序将消息扔进控制台,例如处理文件1
处理文件4
处理文件5
处理文件3
全部完成!
处理文件2
当我切换IProgress(MyProgress.Report())时,Console.WriteLine()它按预期工作.
这是什么原因以及如何控制?
谢谢
我有一个异步方法DoStuffAsync,它使用 生成两个任务Task.Run,并且两个任务都使用单个IProgress<int>对象报告它们的进度。从用户的角度来看,只有一个操作,所以显示两个进度条(每个进度条Task)没有任何意义。这IProgress<int>就是共享的原因。问题是有时 UI 会以错误的顺序接收进度通知。这是我的代码:
private async void Button1_Click(object sender, EventArgs e)
{
TextBox1.Clear();
var progress = new Progress<int>(x => TextBox1.AppendText($"Progress: {x}\r\n"));
await DoStuffAsync(progress);
}
async Task DoStuffAsync(IProgress<int> progress)
{
int totalPercentDone = 0;
Task[] tasks = Enumerable.Range(1, 2).Select(n => Task.Run(async () =>
{
for (int i = 0; i < 5; i++)
{
await Task.Delay(100); // Simulate an I/O operation
var localPercentDone = Interlocked.Add(ref totalPercentDone, 10);
progress.Report(localPercentDone);
}
})).ToArray();
await …Run Code Online (Sandbox Code Playgroud)