Synchroniczne odpytywanie WCF'a w portable class library

Synchroniczne odpytywanie WCF'a w portable class library
KC
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Postów:9
0

Witam, piszę aplikacje na androidową w xamarin'ie, aplikacja musi odpytywać WCF'a, w tym celu wykorzystuje bibliotekę pcl żeby zgrać to wszystko z mvvm cross'em, problem w tym że biblioteka pcl wymaga mapowania wcf'a asychronicznie, do tej pory odpytywanie wyglądało tak:

Kopiuj
string token = _client.Zaloguj(login, password);

Teraz muszę to robić tak:

Kopiuj
string token = "";
            _client.ZalogujCompleted += new EventHandler<ZalogujCompletedEventArgs>((s, e) =>
            {
                token = e.Result;
            });
            _client.ZalogujAsync(login, password);

Sam zapis co prawda dłuższy ale ok, bez tragedii. Problem tkwi w tym że przez asynchroniczność funkcje odpowiadają dopiero po jakimś czasie, i kontrolki ładują mi się puste, najlepiej byłoby poczekać na wynik a dopiero potem zwracać odpowiedź(to najlepsze wyjście dla całej aplikacji), ewentualnie rozwiązać jakoś problem tego że gdy wywołuje funkcje i przypisuje jej wynik do zmiennej zawsze dostaje nulla(w momencie zwracania wyniku tam jest null, tylko że nawet kiedy już wejdzie do web service'u i web service zwróci wynik to go nie przypisuje). Jakieś rady jak się z tym uporać? Wrzucam jeszcze funkcję i jej wywołanie.

Funkcja:

Kopiuj
public async Task<string> Login(string login, string password)
        {
            string token = "";
            _client.ZalogujCompleted += new EventHandler<ZalogujCompletedEventArgs>((s, e) =>
            {
                token = e.Result;
            });
            _client.ZalogujAsync(login, password);

            return await Task.FromResult(token);
        }

Wywołanie:

Kopiuj
_login = new MvxCommand(async () =>
                    {
                        string token = await serv.Login("login", "haslo");
                    });

Kiedy nie korzystam z atrybutów async, await, task, itd wszystko działa dokładnie tak samo. Pilna sprawa, pomóżcie dobrzy ludzie.

Ktos
Moderator
  • Rejestracja:prawie 23 lata
  • Ostatnio:około 10 godzin
1

Nie znam się na WCF, ale obejrzyj to, które zmienia wywołania przy wykorzystaniu zdarzeń *Completed na "nowoczesne" async/await: https://stackoverflow.com/a/48598227

Zresztą możesz zobaczyć, czy nie możesz wygenerować klienta WCF, który od razu będzie zwracał Task (https://stackoverflow.com/questions/13777710/how-to-use-visual-studio-generated-async-wcf-calls/13778263#13778263) i wtedy spokojnie będziesz go używał w async/await.

KC
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Postów:9
0
Ktos napisał(a):

Nie znam się na WCF, ale obejrzyj to, które zmienia wywołania przy wykorzystaniu zdarzeń *Completed na "nowoczesne" async/await: https://stackoverflow.com/a/48598227

Zresztą możesz zobaczyć, czy nie możesz wygenerować klienta WCF, który od razu będzie zwracał Task (https://stackoverflow.com/questions/13777710/how-to-use-visual-studio-generated-async-wcf-calls/13778263#13778263) i wtedy spokojnie będziesz go używał w async/await.

Jeżeli chodzi o generowanie klienta to właśnie nie mogę tego tak zrobić, mam szare te opcje i wyłączony checkbox, gdyby nie to zmieniłbym sobie te ustawienia i po prostu mapował to synchronicznie :(

Za to pierwsza opcja zadziałała!
wstawiłem 3 linie

Kopiuj
            var tcsWorkDone = new TaskCompletionSource<bool>();
Kopiuj
            tcsWorkDone.SetResult(true);
Kopiuj
            await tcsWorkDone.Task;

i działa dokładnie tak jak chciałem, wielkie dzięki!

Ktos
Moderator
  • Rejestracja:prawie 23 lata
  • Ostatnio:około 10 godzin
0

Możesz nie mieć tych opcji bo budujesz dla PCL, możliwe, że jakiegoś zbyt ograniczonego - w zasadzie w ogóle nie wiem dlaczego wspominasz o PCL, skoro mamy .NET Standard, a Xamarin.Android na pewno obsługuje .NET Standard 2.0, czyli m.in. async/await.

KC
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Postów:9
0
Ktos napisał(a):

Możesz nie mieć tych opcji bo budujesz dla PCL, możliwe, że jakiegoś zbyt ograniczonego - w zasadzie w ogóle nie wiem dlaczego wspominasz o PCL, skoro mamy .NET Standard, a Xamarin.Android na pewno obsługuje .NET Standard 2.0, czyli m.in. async/await.

Nie mogłem zainstalować wszystkich rozszerzeń mvvmcross'a w projektach typu .net standard i .net framework, a mostek typu mapowanie w .net standard i wywoływanie w pcl nie wchodzi w grę bo projekty pcl mogą przyjmować referencje tylko od innych projektów pcl

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.