Progressbar a metoda asynchroniczna

0

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

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

zaimplementowana w klasie ServiceTest:

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ą:

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?

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"

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

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:

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.

0

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

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1