Synchroniczne odpytywanie WCF'a w portable class library

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:

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

Teraz muszę to robić tak:

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:

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:

_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.

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.

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

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

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

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.

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

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