gpt4 book ai didi

c# - IProgress 同步

转载 作者:可可西里 更新时间:2023-11-01 08:19:41 29 4
gpt4 key购买 nike

我在 C# 中有以下内容

public static void Main()
{
var result = Foo(new Progress<int>(i =>
Console.WriteLine("Progress: " + i)));

Console.WriteLine("Result: " + result);
Console.ReadLine();
}

static int Foo(IProgress<int> progress)
{
for (int i = 0; i < 10; i++)
progress.Report(i);

return 1001;
}

Main 的一些输出是:

第一次运行:

Result: 1001
Progress: 4
Progress: 6
Progress: 7
Progress: 8
Progress: 9
Progress: 3
Progress: 0
Progress: 1
Progress: 5
Progress: 2

第二次运行:

Progress: 4
Progress: 5
Progress: 6
Progress: 7
Progress: 8
Progress: 9
Progress: 0
Progress: 1
Progress: 2
Result: 1001
Progress: 3

等...

每次运行,输出都是不同的。我如何才能同步这些方法,以便按照报告 0,1,...9 的顺序显示进度,然后是结果 1001。我希望输出如下所示:

Progress: 0
.
.
.
Progress: 9
Result: 1001

最佳答案

Progress<> 类使用 SynchronizationContext.Current 属性来 Post() 进度更新。这样做是为了确保 ProgressChanged 事件在程序的 UI 线程上触发,以便更新 UI 是安全的。需要安全地更新 ProgressBar.Value 属性。

控制台模式应用程序的问题在于它没有同步提供程序。不像 Winforms 或 WPF 应用程序。 Synchronization.Current 属性具有默认提供程序,其 Post() 方法在线程池线程上运行。在没有任何互锁的情况下,哪个 TP 线程首先报告其更新是完全不可预测的。也没有什么好的联锁方式。

只是不要在这里使用 Progress 类,没有意义。您在控制台模式应用程序中没有 UI 线程安全问题,Console 类已经是线程安全的。修复:

static int Foo()
{
for (int i = 0; i < 10; i++)
Console.WriteLine("Progress: {0}", i);

return 1001;
}

关于c# - IProgress<T> 同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17982555/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com