标签: iprogress

使用IProgress.Report()报告进度时,控制台消息的顺序不正确

我注意到以下行为.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()它按预期工作.
这是什么原因以及如何控制?

谢谢

c# console-application iprogress

8
推荐指数
1
解决办法
527
查看次数

如何同步共享的 IProgress&lt;int&gt;

我有一个异步方法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)

c# winforms task-parallel-library async-await iprogress

2
推荐指数
1
解决办法
357
查看次数