0

WCF について頭を悩ませているだけなので、洗練されていないコーディングを許してください。私が抱えている問題は、データをサービスに 2 回送信しているように見えることです (スクリーンショットを参照)。誰かが私が間違っているかもしれないことを教えてもらえますか? または、効率が悪い場合は、より良い方法を提案することさえできます。

コードは次のとおりです。

public void EndOfLevel()
    {
        GlobalVariable.TotalQuestionsAsked = 10;
        GlobalVariable.CorrectDecimal = GlobalVariable.Correct / GlobalVariable.TotalQuestionsAsked;

        //Show loading screen
        UploadingScreen.Visibility = Visibility.Visible;
        //Submit this levels results.

        Service1Client client = null;
        client = new Service1Client();

            //Gather the results and details
            Result thislevel = new Result();
            thislevel.Datetime = DateTime.Now;
            thislevel.result = GlobalVariable.CorrectDecimal;
            thislevel.TimesTable = GlobalVariable.NeedsHelpWith;

            //submit them
            try
            {
                client.SubmitResultAsync(thislevel);
            }
            catch
            {
                MessageBox.Show("Error uploading data");
            }
            finally
            {
                client.Close();
                Results r3 = new Results();
                this.NavigationService.Navigate(r3);
            }



    }

WCF テスト クライアント:

結果のスクリーンショット

乾杯、ニック

4

1 に答える 1

1

よろしければ、WPF アプリケーションと WCF サービス間の非同期呼び出しを管理するためのパターンを次に示します。

このセクションでは、サービス メソッドを呼び出す前にクライアントへの接続が開かれていることを保証する、サービス クライアントへのパブリック アクセサーがあります。

public static MyServiceClient Client
{
    get
    {
        return GetMyServiceClient();
    }
}
private static MyServiceClient client;

private static MyService.MyServiceClient GetMyServiceClient()
{
    VerifyClientConnection();

    return client;
}

private static void VerifyClientConnection()
{
    if (client == null || client.State == System.ServiceModel.CommunicationState.Closed)
    {
        client = new MyService.MyServiceClient();
    }
}

このセクションでは、非同期呼び出しとコールバック パターンの例を示します (この例は、サービスに例外データを渡すために使用しているデリゲートとコールバックを示しています)。

public delegate void LogExceptionCompletedEvent();
public static LogExceptionCompletedEvent LogExceptionCompleted;

public static void LogExceptionAsync(SilverlightException exception)
{
    string json = JsonConvert.SerializeObject(exception);

    Client.LogExceptionCompleted -= client_LogExceptionCompleted;
    Client.LogExceptionCompleted += client_LogExceptionCompleted;
    Client.LogExceptionAsync(json);
}

private static void client_LogExceptionCompleted(object sender, AsyncCompletedEventArgs e)
{
    if (LogExceptionCompleted != null)
    {
        LogExceptionCompleted();
    }
}

この例では、ビュー モデルはイベント ハンドラーを LogExceptionCompleted デリゲートにアタッチし、サービスから戻るときにコールバックの結果を受け取ることができます。

基本的に、アプリケーションから行う必要がある非同期 WCF サービス呼び出しに対してこのパターンを繰り返します。これにより、それらが非常に整理され、単体テストが容易になります。

于 2012-04-07T04:59:29.830 に答える