Progressbar a metoda asynchroniczna

Progressbar a metoda asynchroniczna
R9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 36
0

Witam, sprawa tyczy się pokazania na kontrolce progressbar aktualnego stanu danej operacji. Mam napisaną usługę sieciową ze zwyczajną metodą "suma":

Kopiuj
[OperationContract]
double suma(double a, double b);

zaimplementowana w klasie ServiceTest:

Kopiuj
public double suma(double a, double b)
{
    return a + b;
}

Po dodaniu Service References do wcześniej stworzonego projektu, została wygenerowana klasa z metodą asynchroniczną, która nazywa się "sumaAsync". Po kliknięciu w button wywołuje ją:

Kopiuj
private async void button1_Click(object sender, EventArgs e)
{
    var client = new ServiceReference1.ServiceTestClient();  
    var result = await client.sumaAsync(value1, value2);
} 

Wynik wyświetlam w textBoxie i chciałbym na progressbarze pokazać wspomniany stan tej operacji. Jej postęp. Robiłem to na kilka sposobów, m.in. po prostu dawałem timer start na początku i timer stop na końcu i podpinałem to pod progressbar. Tworzyłem tez oddzielną metodę w oparciu o klasę Task, w której wywoływałem 'sumaAsync' i dopiero pod buttonem wykonywał się progress. Finał jest taki, że dopiero jak wynik jest już w textBoxie progressbar pokazuje ten niby postęp. Ma ktoś jakiś pomysł jak to zrobić z wykorzystaniem async i await lub wytłumaczyłby jak to sensownie pokazać na progressbar?

JU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5046
0

Poczytaj o metodach Invoke i BeginInvoke. Popatrz na przykłady. W google możesz szukać pod kątem: "c# update gui from different thread"

  • Rejestracja: dni
  • Ostatnio: dni
0

Witam,

Trochę ciężko będzie dodać ProgressBar do atomowej operacji, przetwarzanie kolekcji albo jakiejś tablicy jest bardziej naturalne. Do pojedynczych funkcji musisz dodać sobie jakiś event który będzie wołany za każdym razem gdy operacje w wywoływanej funkcji wykonają jakiś znaczący krok. Posiadając taki event podpinasz do niego funkcje odpowiedzialną za wyświetlanie progress-u. Na Google znajdziesz kilka przykładów np https://stackoverflow.com/questions/135478/how-do-you-measure-the-progress-of-a-web-service-call

Pozdrawiam,

mr-owl

grzesiek51114
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2442
0

Można przekazać informację o postępie do ProgressBar'a (przynajmniej w WPF) z innego wątku wykorzystując np. wzorzec obserwatora.

  • Klasa obserwowana implementuje IObservable<int>;
  • Klasa obserwująca czyli ta, w której jest ProgressBar natomiast: IObserver<int>;

Gdzie int jest postępem pracy, czyli odnosi się do jakiejś zmiennej inkrementowanej w metodzie.
Przy każdym postępie prac np. w pętli wykonywany jest kod:

Kopiuj
this.progressObservers.ForEach(obj => { obj.OnNext(totalBytes); });

Gdzie totalBytes jest właśnie tym obiektem typu int, czy jaki tam typ chcemy mierzyć.

Nie wiem czy o to chodziło, bo poruszam niekoniecznie kwestię await i async ale sprawdzone z autopsji wielokrotnie i działa.

SO
  • Rejestracja: dni
  • Ostatnio: dni
0

Możesz też zainteresować się klasą Progress<T>.

http://blog.stephencleary.com/2012/02/reporting-progress-from-async-tasks.html

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.