MvvmCrossコマンド内の非同期タスクが返されない

ジョン・コーガン

Xamarin PCLプロジェクト内でMvvMCrossを使用して小さなプロジェクトを構築していますが、ボタンにバインドされたコマンド内で呼び出している非同期タスクに問題があります。

私は偽のWebサービスを持っています-そこで私は単にTask.Delay(3000)を呼び出します。プロセスがこのポイントに到達すると、それは単に座って何もしません。

私はもともと.wait()呼び出しを使用してコマンド呼び出しを行いましたが、これはブロッキング呼び出しであり、「async / wait」でマウス化できないことをどこかで読みました

誰かが助けてくれて、コマンドバインディングのどこが間違っているのかについてのヒントを教えてもらえますか?

https://bitbucket.org/johncogan/exevaxamarinappはパブリックgitリポジトリであり、特定のコマンドは

public ICommand SaveProfile

ProfileViewModel.csファイル内。

具体的なコードは次のとおりです。

public ICommand SaveProfile
    {
        get
        {
            return new MvxCommand(() =>
            {
                if (_profile.IsValidData())
                {
                    // Wait for task to compelte, do UI updates here
                    // TODO Throbber / Spinner
                    EnumWebServiceResult taskResult;
                    Mvx.Resolve<IProfileWebService>().SendProfileToServer(_profile).Wait();

                    if(_profileWebService.getLastResponseResult() == true){
                        taskResult = EnumWebServiceResult.SUCCESS;
                    }else{
                        taskResult = EnumWebServiceResult.FAILED_UNKNOWN;
                    }
                    //_profileWebService.SendProfileToServer(_profile).Wait();
                    // Close(this);
                }
            });
        }
    }

Webサービスクラス()は次のとおりです。

using System;
using System.Threading.Tasks;
using ExevaXamarinApp.Models;

namespace ExevaXamarinApp.Services
{
public class FakeProfileWebService : IProfileWebService
{
    public int _delayPeriod { get; private set; }
    public bool? lastResult;

    /// <summary>
    /// Initializes a new instance of the <see cref="T:ExevaXamarinApp.Enumerations.FakeProfileWebService"/> class.
    /// </summary>
    /// 3 second delay to simulate a remote request
    public FakeProfileWebService()
    {
        _delayPeriod = 3000;
        lastResult = null;
    }

    private Task Sleep()
    {
        return Task.Delay(3000);
    }

    public bool? getLastResponseResult(){
        return lastResult;
    }

    /// <summary>
    /// Sends the profile to server asynchronously
    /// </summary>
    /// <returns>EnumWebServiceResultFlag value</returns>
    /// <param name="profileObject">Profile model object</param>
    public async Task SendProfileToServer(Profile profileObject)
    {
        // Validate arguments before attempting to use web serivce
        if (profileObject.IsValidData())
        {
            // TODO: Return ENUM FLAG that represents the state of the result
            await Sleep();
            lastResult = true;
        }else{
            lastResult = false;
        }
    }
}
}
ショーン・ステインズ

これを試してください:

    public ICommand SaveProfile
    {
        get
        {
            return new MvxCommand(async () =>              // async added
            {
                if (_profile.IsValidData())
                {
                    // Wait for task to compelte, do UI updates here
                    // TODO Throbber / Spinner
                    EnumWebServiceResult taskResult;
                    await Mvx.Resolve<IProfileWebService>().SendProfileToServer(_profile).ConfigureAwait(false);         // await, confi.. added

                    if(_profileWebService.getLastResponseResult() == true){
                        taskResult = EnumWebServiceResult.SUCCESS;
                    }else{
                        taskResult = EnumWebServiceResult.FAILED_UNKNOWN;
                    }
                    //_profileWebService.SendProfileToServer(_profile).Wait();
                    // Close(this);
                }
            });
        }
    }

    private async Task Sleep()                                 // async added
    {
        return await Task.Delay(3000).ConfigureAwait(false);   // await, confi... added
    }

    public async Task SendProfileToServer(Profile profileObject)
    {
        // Validate arguments before attempting to use web serivce
        if (profileObject.IsValidData())
        {
            // TODO: Return ENUM FLAG that represents the state of the result
            await Sleep().ConfigureAwait(false);                      // await, confi... added
            lastResult = true;
        }else{
            lastResult = false;
        }
    }

問題は、UIと非同期からのコンテキストがデッドロックを引き起こすことです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

非同期タスク内でのさまざまなコマンドの実行

分類Dev

ディレクティブ内の非同期サービスのハンドラーでスコープを変更した後、DOMが更新されない

分類Dev

非同期タスク関数C#/。NET /コンパイルされないのを待つスレッド

分類Dev

タスク非同期呼び出しが返されないとデッドロックが発生する

分類Dev

Androidの非同期タスクにprogressdialogが表示されない

分類Dev

単体テストの実行時に非同期アクション クリエーター内の .forEach がアクションを返さない

分類Dev

分度器/ジャスミン2-指定されたタイムアウト内に非同期コールバックが呼び出されない

分類Dev

AngularJs:非同期データが到着したときにディレクティブ内のスコープが更新されないのはなぜですか?

分類Dev

Android Studio-UIスレッドが非同期タスクで更新されない

分類Dev

エラーが渡されない限り、.catch()が非同期関数のループ内のPromiseコンストラクター内でreject()をキャッチしないのはなぜですか?

分類Dev

関数内で変数を変更した後、変数が変更されないのはなぜですか?-非同期コードリファレンス

分類Dev

.Netネイティブのスレッドプールで実行される非同期タスクのパフォーマンスが非常に低い

分類Dev

Python非同期タスクが開始されない

分類Dev

画面の回転後に非同期タスクonPostExecuteが実行されない

分類Dev

異なるdbContextsでの非同期タスク。このコンテキストで2番目の操作が開始されたと言います

分類Dev

「「非同期スコープ」ライフスタイルとして登録されているが、インスタンスがアクティブな(非同期スコープ)スコープのコンテキスト外で要求されている」を解決する方法

分類Dev

ループ内の変数をデクリメントしても成功ステータスコードが返されないのはなぜですか?

分類Dev

メソッドが非同期のネストされた例外スタックトレースに2回表示されないのはなぜですか?

分類Dev

Winforms-タイマー:非同期スレッドで開始され、UIスレッドのティックイベントが省略されます

分類Dev

非同期コードが非同期で実行されないのはなぜですか?

分類Dev

非同期と待機:署名がタスクの戻り値の型を定義する非同期メソッドが明示的にタスクを返さないのはなぜですか?

分類Dev

Kotlin-コルーチンスコープ、非同期が実行されないのはなぜですか?

分類Dev

ノード/エクスプレス非同期関数res.sendがコンソールに表示され、ページには表示されない

分類Dev

IAsyncEnumerableを返す非同期メソッドが構造体ではなくクラスとして実装されているのはなぜですか?

分類Dev

非同期インターフェース管理->管理されていないコード

分類Dev

Spring Boot:非同期リクエストが何も返さない

分類Dev

ビューコントローラが変更されたときのafnetworking非同期バックグラウンドタスクハンドル応答

分類Dev

非同期プログラミング、コードが実行されないのはなぜですか

分類Dev

python-asyncioを使用してバインドされたメソッドへの一時的な非同期タイマーコールバックを作成する

Related 関連記事

  1. 1

    非同期タスク内でのさまざまなコマンドの実行

  2. 2

    ディレクティブ内の非同期サービスのハンドラーでスコープを変更した後、DOMが更新されない

  3. 3

    非同期タスク関数C#/。NET /コンパイルされないのを待つスレッド

  4. 4

    タスク非同期呼び出しが返されないとデッドロックが発生する

  5. 5

    Androidの非同期タスクにprogressdialogが表示されない

  6. 6

    単体テストの実行時に非同期アクション クリエーター内の .forEach がアクションを返さない

  7. 7

    分度器/ジャスミン2-指定されたタイムアウト内に非同期コールバックが呼び出されない

  8. 8

    AngularJs:非同期データが到着したときにディレクティブ内のスコープが更新されないのはなぜですか?

  9. 9

    Android Studio-UIスレッドが非同期タスクで更新されない

  10. 10

    エラーが渡されない限り、.catch()が非同期関数のループ内のPromiseコンストラクター内でreject()をキャッチしないのはなぜですか?

  11. 11

    関数内で変数を変更した後、変数が変更されないのはなぜですか?-非同期コードリファレンス

  12. 12

    .Netネイティブのスレッドプールで実行される非同期タスクのパフォーマンスが非常に低い

  13. 13

    Python非同期タスクが開始されない

  14. 14

    画面の回転後に非同期タスクonPostExecuteが実行されない

  15. 15

    異なるdbContextsでの非同期タスク。このコンテキストで2番目の操作が開始されたと言います

  16. 16

    「「非同期スコープ」ライフスタイルとして登録されているが、インスタンスがアクティブな(非同期スコープ)スコープのコンテキスト外で要求されている」を解決する方法

  17. 17

    ループ内の変数をデクリメントしても成功ステータスコードが返されないのはなぜですか?

  18. 18

    メソッドが非同期のネストされた例外スタックトレースに2回表示されないのはなぜですか?

  19. 19

    Winforms-タイマー:非同期スレッドで開始され、UIスレッドのティックイベントが省略されます

  20. 20

    非同期コードが非同期で実行されないのはなぜですか?

  21. 21

    非同期と待機:署名がタスクの戻り値の型を定義する非同期メソッドが明示的にタスクを返さないのはなぜですか?

  22. 22

    Kotlin-コルーチンスコープ、非同期が実行されないのはなぜですか?

  23. 23

    ノード/エクスプレス非同期関数res.sendがコンソールに表示され、ページには表示されない

  24. 24

    IAsyncEnumerableを返す非同期メソッドが構造体ではなくクラスとして実装されているのはなぜですか?

  25. 25

    非同期インターフェース管理->管理されていないコード

  26. 26

    Spring Boot:非同期リクエストが何も返さない

  27. 27

    ビューコントローラが変更されたときのafnetworking非同期バックグラウンドタスクハンドル応答

  28. 28

    非同期プログラミング、コードが実行されないのはなぜですか

  29. 29

    python-asyncioを使用してバインドされたメソッドへの一時的な非同期タイマーコールバックを作成する

ホットタグ

アーカイブ