【发布时间】:2017-11-08 10:35:05
【问题描述】:
玩 Progress 类:
static async Task MyMethodAsync(IProgress<double> progress = null)
{
int done = 0;
while (done<100)
{
if (progress != null)
progress.Report(done);
done++;
}
}
static async Task CallMyMethodAsync()
{
var progress = new Progress<double>();
progress.ProgressChanged += (sender, args) =>
{
Console.WriteLine("progr " + args);
};
await MyMethodAsync(progress);
}
public static void Main()
{
CallMyMethodAsync();
Console.WriteLine("done with caller");
Console.ReadLine();
}
得到的输出顺序不正确:
done with caller
progr 2
progr 3
progr 4
progr 5
progr 6
progr 7
progr 8
progr 9
progr 10
progr 12
progr 11
progr 0
progr 13
progr 16
progr 17
progr 18
progr 19
progr 20
progr 21
progr 22
progr 23
progr 24
progr 25
progr 26
为什么以及如何实现正确的顺序?
【问题讨论】:
-
我猜这是一个控制台应用程序?那些没有同步上下文,所以
Progresscallbacks are serviced on the Thread Pool。所以你不知道它们什么时候会真正被安排,并且多个回调可能同时在飞行中,然后竞争Console锁来实际执行它们的写入。 -
也许 IProgress 不适合在很短的时间内跟踪进度。如果你只是在你的循环中放一个节奏,一切都应该正常工作。在正常用例中,应使用 IProgress 来跟踪函数调用的进度,而不是循环迭代(这要快得多)
标签: c# asynchronous