0

SOAP Web サービス バックエンドを呼び出す Windows Phone 8 コードを書いています。私が読んだことから、典型的なパターンは次のとおりです。

var client = new KitchenPCSoapClient();

client.LogonCompleted += client_LogonCompleted;
client.LogonAsync(username, password);

私には、これは直観に反しているように思えます。同じクライアントで複数回呼び出す場合、毎回LogonAsync同じコールバックを使用する必要はありません。LogonCompleted

私が望むのは、コールバック関数への参照を渡す JavaScript に似たパターンです。もっと好き:

var client = new KitchenPCSoapClient();
client.LogonAsync(username, password, client_LogonCompleted);

そのようなパターンを実装する方法はありますか、またはLogonCompletedを呼び出す前にプロパティの設定に慣れるように強制するか、異なるコンテキストを区別したい場合はプロパティを設定する必要がありますか?LogonAsyncuserState

4

2 に答える 2

0

Dispatcher を利用して、このために UI 側で関数を呼び出すことができます...

私はこのようにやっています

コールバック関数

private void AddPricesHandler(CompletedEventArgs response, Exception e)
{
  //your code gose here
}

プロキシ呼び出し関数

Proxy.AddData(AddPricesHandler, request);

Web サービスを呼び出すプロキシ クラス

public void AddData(Action<CompletedEventArgs, Exception> callback, IPVWorkflowService.CreateEditDeletePriceSourceRequest request)
        {
            _workflowProxy.CreateEditDeletePriceSourceAsync(request, callback);
            _workflowProxy.CreateEditDeletePriceSourceCompleted+=new EventHandler<CreateEditDeletePriceSourceCompletedEventArgs>(_workflowProxy_CreateEditDeletePriceSourceCompleted); 
        }

コンプリーター関数は、ディスパッチャーを使用してコールバック関数を呼び出します

    void _workflowProxy_CreateEditDeletePriceSourceCompleted(object sender, CreateEditDeletePriceSourceCompletedEventArgs e)
    {
        try
        {
            this.dispatcher.BeginInvoke((Action)(() =>
            {
                (e.UserState as Action<CompletedEventArgs, Exception>)(e, null);
            }));
        }
        catch (Exception ex)
        {
            this.dispatcher.BeginInvoke((Action)(() =>
            {
                (e.UserState as Action<CompletedEventArgs, Exception>)(e, ex);
            }));
        }
        finally
        {
            _workflowProxy.CreateEditDeletePriceSourceCompleted -= _workflowProxy_CreateEditDeletePriceSourceCompleted;
            _workflowProxy = null;
        }
    }
于 2012-11-22T08:11:16.817 に答える
0

Async/Await の優れた点は、コールバックを記述する必要がないことです。同期のように見えるコードを記述するだけで、バックグラウンドでは非同期で実行されます。

var client = new KitchenPCSoapClient();
await client.LogonAsync(username, password);

// you get here after the async logon is completed
// do stuff after logon

しかし、本当にコールバックを使用したい場合は、非同期メソッドから返される Task オブジェクトでメソッド ContinueWith を使用するだけです。

var client = new KitchenPCSoapClient();
Task task = client.LogonAsync(username, password);

// this method is called when async execution of task is finished
task.ContinueWith(client_LogonCompleted);
于 2012-11-22T08:26:40.657 に答える