I do requests to Github Api so I have async methods, these do this job. Before it, I always called they in method, that calls from command(actually DelegateCommand). But now I wanna do request in ViewModel because I need to display list on page. I am using Prism to wire view and viewmodel. Because I can't make viewmodel async, I can't use await word, so I tried to do something like gets result from task, or task.wait. But with this I have the same result. My app stop works with white display when it did request. I read some info about that and I understood that call async method in not async method is bad, and it causes deadlock, but I don't know what to do with this. And I think deadlock causes that app stop works.Here is method where app die:
public async Task<IEnumerable<RepositoryModel>> GetRepositoriesAsync(){ try { var reposRequest = new RepositoryRequest { Sort = RepositorySort.FullName }; var gitHubRepos = await _gitHubClient.Repository.GetAllForCurrent(reposRequest); //async request, don't say about name convention, it is not my method. var gitRemoteRepos = new List<RepositoryModel>(); foreach ( var repository in gitHubRepos ) { var repos = new RepositoryModel(); repos.RepositoryTypeIcon = GetRepositoryTypeIcon(repository); gitRemoteRepos.Add(repos); } return gitRemoteRepos; } catch ( WebException ex ) { throw new Exception("Something wrong with internet connection, try to On Internet "+ ex.Message); } catch ( Exception ex ) { throw new Exception("Getting repos from github failed! "+ ex.Message); }}
And here is viewmodel:
public class RepositoriesPageViewModel : BindableBase{ private INavigationService _navigationService; private readonly Session _session; public ObservableCollection<RepositoryModel> Repositories { get; } private readonly RepositoriesManager _repositoriesManager; public RepositoriesPageViewModel(INavigationService navigationService, ISecuredDataProvider securedDataProvider) { _navigationService = navigationService; var token = securedDataProvider.Retreive(ConstantsService.ProviderName, UserManager.GetLastUser()); _session = new Session(UserManager.GetLastUser(), token.Properties.First().Value); var navigationParameters = new NavigationParameters { { "Session", _session } }; _repositoriesManager = new RepositoriesManager(_session); var task = _repositoriesManager.GetRepositoriesAsync(); //task.Wait(); Repositories = task.Result as ObservableCollection<RepositoryModel>; }}