簡體   English   中英

從Xamarin.Android事件處理程序死鎖異步調用WebAPI

[英]Calling a WebAPI asynchronously from a Xamarin.Android event handler deadlocks

我一直在努力解決這個問題,現在是時候在這里提出我的問題了。 因此,情況如下:

我有一個WebAPI,一個Xamarin.Android應用程序和一個IdentityServer4實現。 Xamarin.Android應用程序需要調用WebAPI才能基於搜索獲得用戶列表。 這是通過TextChanged事件處理程序中的異步調用完成的。 發生的事情是,當等待對WebAPI的調用時,它永遠不會返回,並且在某個時候任務被取消。 我嘗試使用ConfigureAwait(false),使事件處理程序方法異步無效,在這里我已經閱讀了有關類似問題的其他幾個問題-這些選項都不適合我。 但是這里有一些代碼讓您了解我在做什么:

TextChanged處理程序:

protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        SetContentView(Resource.Layout.SearchPeopleLayout);

        this.searchUsersElement = FindViewById<EditText>(Resource.Id.searchUsersField);
        this.usersListElement = FindViewById<ListView>(Resource.Id.usersSearchResult);

        using (var scope = App.Container.BeginLifetimeScope())
        {
            this.apiClient = App.Container.Resolve<IUsersApiClient>();
        }

        this.searchUsersElement.TextChanged += SearchUsersElement_TextChanged;
    }

    public async void SearchUsersElement_TextChanged(object sender, Android.Text.TextChangedEventArgs e)
    {
        var length = e.Start + e.AfterCount;
        if (length <= MinUsernameLength)
        {
            return;
        }

        var searchName = string.Join(string.Empty, e.Text);

        var users = await this.apiClient.GetUsers(searchName, Persistor.ApiClient);

        RunOnUiThread(() =>
        {
            var usersAdapter = new UsersAdapter(this, users.ToList());

            this.usersListElement.Adapter = usersAdapter;
        });
    }

這是UsersApiClient的實現:

public async Task<IEnumerable<UserModel>> GetUsers(string username, HttpClient client)
    {
        try
        {
            var content = await client.GetStringAsync($"{apiUrl}/users?name={username}").ConfigureAwait(false);

            var result = JsonConvert.DeserializeObject<IEnumerable<UserModel>>(content);

            return result;
        }
        catch (Exception ex)
        {
            throw ex;
        }

    }

死鎖發生在GetStringAsync()調用上。 我已經測試了通過郵遞員撥打的電話,它給了我正確的答復。 只有我還沒有嘗試過的事情是實現ITextWatcher接口,而不是添加事件處理程序,並更改代碼,因此我不使用單獨的方法,而是使用匿名委托-我在某些地方閱讀了可能證明是一個問題。

我真的希望你們中的一些人可以幫助我解決這個問題,並使我理解如何正確地進行此類異步調用。

最好的祝福。

好的,所以我不太確定是什么解決了該問題,但這是我所做的-還有另一個StackOverflow問題,存在類似的問題,該問題是通過在重新部署之前從模擬器中手動卸載應用程序解決的。 我還刪除了ConfigureAwait(false)調用。 突然之間,一切正常。 不知道它是如何發生的,但是這里是-手動卸載應用程序並在沒有ConfigureAwait(false)的情況下調用API。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM