Mam następujący w C#IProgress <T> synchronizacja
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;
}
Niektóre wyjścia z głównych to:
Pierwszy bieg:
Result: 1001
Progress: 4
Progress: 6
Progress: 7
Progress: 8
Progress: 9
Progress: 3
Progress: 0
Progress: 1
Progress: 5
Progress: 2
Drugi bieg:
Progress: 4
Progress: 5
Progress: 6
Progress: 7
Progress: 8
Progress: 9
Progress: 0
Progress: 1
Progress: 2
Result: 1001
Progress: 3
etc ...
Dla każdego przebiegu wynik jest inny. Jak mogę zsynchronizować te metody tak, że postęp jest wyświetlany w kolejności, w jakiej zostały zgłoszone 0,1, ... 9, a następnie w wyniku których jest 1001. Chcę wyjście być tak:
Progress: 0
.
.
.
Progress: 9
Result: 1001
Projektuję bibliotekę, która będzie używana w aplikacji konsoli, potencjalnie aplikacji GUI (w tym aplikacjach internetowych). Inną alternatywą, o której myślałem, jest użycie delegata Action, który działa w tym scenariuszu, ale nie jestem pewien, czy jest to najlepsze rozwiązanie, jeśli moja lib jest używana z aplikacji GUI. Co myślisz? –
danze
Nie możesz podjąć tej decyzji w przypadku aplikacji, której nie znasz, nie masz pojęcia, jakie są jej wymagania dotyczące wątków, ani nie możesz założyć, że używasz konkretnego wątku. Więc nie rób tego, podnieś wydarzenie i pozwól aplikacji klienta sobie z tym poradzić. –
Właściwie kod nie jest taki zły, jak napisałeś, jak mówi Hans, nie możesz podjąć decyzji w swojej bibliotece, więc używanie interfejsu IProgress jest zdecydowanie dobrym pomysłem. Z aplikacji GUI korzystasz z implementacji Progress, z aplikacji Console możesz korzystać z własnej implementacji. Jeśli chcesz, twoja implementacja IProgress może po prostu ominąć działanie , więc będzie działać tak, jak chcesz. Wolałbym to robić w przypadku zdarzeń, IProgress wydaje się być standardem teraz. –