1

構築しておらず、制御できない.net2.0時代の.asmxWebサービスを使用する必要があります。ただし、このサービスは可用性が高く、これを処理できます。

私が助けを必要としているのはクライアントであり、VisualStudioで生成されたクライアントプロキシを同時性の観点から正しく使用しています。現在、Webリファレンスを使用していますが、必要に応じてサービスリファレンスに切り替えることができます。私はWCFについては何も知りません。

読めば読むほど、混乱してしまいます。

私の具体的な質問:

次のようなメソッドを生成するVisualStudioで生成されたsoapクライアントプロキシがあるとします。

Foo();
FooAsync();
FooCompleted;

Bar();
BarAsync();
BarCompleted;
  1. Parallel.ForEachのように、複数のスレッドからFoo()を呼び出す必要がありますか?
  2. 並列foreach内でFooAsync()を呼び出す必要がありますか?私はすでに別のスレッドにいるので、これは冗長に見えますか?これを行うのは安全ですか?
  3. 別のスレッドでBarAsync()を呼び出しているときに、あるスレッドでFooAsync()を呼び出す必要がありますか?
  4. これらの生成されたsoapサービスクラスは、EAPパターンを実装しているようです。私はpfx/tplに慣れていないのですが、これをより適切に管理する方法としてタスクを検討してきましたか?TaskCompletionSourceを使用してEAPをタスクでラップする方法の例を見てきました。それはここでのより良いアプローチですか?
4

1 に答える 1

2
  1. 必要な数のスレッドを呼び出すことができます(自分ですべきFoo()かどうかを決定する必要があります)。それらは(あなたが提案するように)並行して実行されているかのように実行されます。

  2. 以下に、タスク並列ライブラリ(TPL)を使用して必要なものの例を示します。FooAsync()すでにスレッドをスポーンしている場合は、スレッドをスポーンするのは冗長ですFoo()が、これは正確に何をしているのか、または何をしたいのかによって異なります。通常Foo()、UIスレッドから呼び出し、UIスレッドは別のスレッドでを起動しFooAsync()ます。

    private void Foo()
    {
        // Get TaskScheduler to facilitate manipulation of GUI on UI Thread.
        TaskScheduler uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
    
        // Cancellation support.
        CancellationTokenSource cancelSource = new CancellationTokenSource();
        CancellationToken token = cancelSource.Token;
    
        // Spin-off onto background thread.
        Task<bool> asyncFooTask = null;
        asyncFooTask = Task.Factory.StartNew<bool>(() => asyncFoo(uiScheduler, token, _dynamic), token);
    
        // Continuation/call-back/error-handling.
        asyncTask.ContinueWith(task =>
        {
            // Check task status.
            switch (task.Status)
            {
                // Handle any exceptions to prevent UnobservedTaskException.             
                case TaskStatus.RanToCompletion:
                    if (asyncTask.Result)
                        // Success. Do stuff.
                    else
                        // Failed. Do stuff.
                    break;
                case TaskStatus.Canceled:
                    if (task.Exception != null)
                        // Cancelled with exception.
                    else
                        // User cancelled.
                    break;
                case TaskStatus.Faulted:
                    if (task.Exception != null)
                        // AggregateException thrown by antecident.
                    else
                        // Task failed...
                    break;
            }
            return;
        }, TaskScheduler.FromCurrentSynchronizationContext());
    }
    

TPLとその使用法の優れた紹介については、このリンクを参照してください。また、一般的なスレッディング(およびいくつかの異なる装い)の詳細については、J.Albahariのスレッディングページを参照してください。

3これは完全に主観的なものであり、何をしたいかによって異なります。回答1が示唆しているように、これらの各メソッドは、必要な数のスレッドで呼び出すことができます。

4 EAPパターンの優れた例については、こちらを参照してください。ご覧のとおり、これは基本的に上記で提供したものです。上記のメソッドでは、'FooCompleted()を実行して完了したと仮定and 'BarCompleted()FooAsync()ますBarAsync()。この場合、EPLパターンはまさにあなたが望むものだと思います。

これがお役に立てば幸いです。

于 2012-04-25T07:39:19.950 に答える