Quantcast
Channel: User Yura Babiy - Stack Overflow
Viewing all articles
Browse latest Browse all 39

Async method that calls in ViewModel causes deadlock

$
0
0

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>;    }}

Viewing all articles
Browse latest Browse all 39

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>