0

私のアプリでは、顧客データを取得するために Web サービスを呼び出します。私が遭遇している問題は、この特定の呼び出しを行うと、非同期の await 呼び出しを取得し、呼び出しを終了してから結果を保存せずにループバックすることです。

private void DatabaseTest()
{
    cNum = Convert.ToString(db.selectCustomerNumber());
    callC = "SELECT * FROM dashboardCustomer WHERE period = 'C' AND customerNumber = " + cNum;
    callB = "SELECT * FROM dashboardCustomer WHERE period = 'B' AND customerNumber = " + cNum;
    callF = "SELECT * FROM dashboardCustomer WHERE period = 'F' AND customerNumber = " + cNum;
    if (db.selectDashboard(callC).Count == 0)
    {
        GetDataSummary(passC);
    }
    if (db.selectDashboard(callB).Count == 0)
    {
        GetDataSummary(passB);
    }
    if (db.selectDashboard(callF).Count == 0)
    {
        GetDataSummary(passF);
    }
}

    private async void GetDataSummary(string r)
    {

        long customerNum = db.selectCustomerNumber();
        pin = db.selectPinByCustomerNumber(customerNum);

        string cType = r;
        try
        {
            Windows.Security.Credentials.PasswordVault vault = new Windows.Security.Credentials.PasswordVault();
            IReadOnlyList<PasswordCredential> userCredential = vault.FindAllByResource(pin);

            userCredential[0].RetrievePassword();

            try
            {
                getCustomerBillSummaryResponse billSum = await
                    UBPclient.getCustomerBillSummaryAsync(userCredential[0].UserName, userCredential[0].Password, customerNum, cType);

                invoiceSummaryBean[] summaryList = billSum.@return;

                rh.DashboardHandler(summaryList, customerNum);


            }
            catch
            {

            }
        }
        catch
        {

        }

    }

それは次の部分に実行されます

getCustomerBillSummaryResponse billSum = await
                    UBPclient.getCustomerBillSummaryAsync(userCredential[0].UserName, userCredential[0].Password, customerNum, cType);

その後、try にループバックし、3 回実行されるまで再度実行します。

呼び出しごとに想定されるデータを返してデータベースに保存するにはどうすればよいですか?

また、SoapUI で Web サービスをテストしたところ、呼び出しが結果を返しているため、問題は Web サービスにありません。

4

2 に答える 2

2

これを行う必要があります:

private async Task GetDataSummary(string r)

呼び出し元が待機する必要があるため、Task代わりに戻る必要があります。voidを返すときvoid、呼び出し元はメソッドを「ファイア アンド フォーゲット」として扱わなければなりません。に戻るTaskと、呼び出し元はawaitasync メソッドを終了するために必要なコードを作成できます。

また、呼び出すときに await キーワードを追加することを忘れないでください。await GetDataSummaryAsync(...);

于 2013-07-16T14:51:35.100 に答える
1

避けるべきasync voidです。GetDataSummaryreturnTaskに変更しawaitてからDatabaseTest:

private async Task DatabaseTestAsync()
{
    ...
    if (db.selectDashboard(callC).Count == 0)
    {
        await GetDataSummaryAsync(passC);
    }
    if (db.selectDashboard(callB).Count == 0)
    {
        await GetDataSummaryAsync(passB);
    }
    if (db.selectDashboard(callF).Count == 0)
    {
        await GetDataSummaryAsync(passF);
    }
}

private async Task GetDataSummaryAsync(string r)
于 2013-07-16T14:53:26.440 に答える