1

クライアントの接続を維持するのに時間がかかりすぎる非常に長時間実行されるクエリがあります。DomainService を呼び出し、新しいワーカー スレッドを作成し、サービスから戻って、クライアントがポーリングを開始して長時間実行されているクエリが完了したかどうかを確認したいと考えています。

私が直面している問題は、呼び出し元のスレッドがすぐに終了するため、元のスレッドが終了すると ObjectContext が破棄されるため、ワーカーがエンティティにアクセスしようとすると例外がスローされることです。

新しいコンテキストを作成し、Silverlight クライアントから呼び出す方法は次のとおりです。

MyDomainContext context = new MyDomainContext();
context.SearchAndStore(_myParm, SearchQuery,
    p => {
        if (p.HasError) { // Do some work and return to start 
        }                 // polling the server for completion...
    }, null);

サーバーでの入力方法:

[Invoke]
public int SearchAndStore(object parm)
{
    Thread t = new Thread(new ParameterizedThreadStart(SearchThread));
    t.Start(parms);     
    return 0;
    // Once this method returns, I get ObjectContext already Disposed Exceptions
}

新しいスレッドで呼び出される WorkerProc メソッドを次に示します。query1 オブジェクトを反復処理しようとするとすぐに、ObjectContext already Disposed 例外が発生します。

private void WorkerProc(object o)
{
    HashSet<long> excludeList = new HashSet<long>();

    var query1 = from doc in this.ObjectContext.Documents
        join filters in this.ObjectContext.AppliedGlobalFilters
            .Where(f => f.FilterId == 1)  
        on doc.FileExtension equals filters.FilterValue
        select doc.FileId;

    foreach (long fileId in query1) // Here occurs the exception because the
    {                               // Object Context is already disposed of.
        excludeList.Add(fileId);
    }
}

どうすればこれを防ぐことができますか? 新しいスレッドの新しいコンテキストを作成する方法はありますか? 私は本当にこれにこだわっています。

ありがとう。

4

1 に答える 1

0

WCF RIAを使用しているため。2 つの部分を実装していると仮定する必要があります。

  • WCF Web サービス
  • WCF サービスを使用する Silverlight クライアント。

したがって、これは 2 つのアプリケーションがあることを意味します。IIS で実行されるサービスと、Web ブラウザーで実行される Silverlight。これらのアプリケーションのライフサイクルは異なります。Silverlight アプリケーションは、Web ページに読み込まれると起動し、ページが閉じられる (または例外が発生する) と終了します。一方で (サーバー側では)、WCF Web サービスの寿命はかなりのものです。アプリケーションは、サービスがリクエストされると起動し、リクエストが完了すると終了します。

あなたの場合、SearchAndStoreメソッドが終了すると、サーバー要求が終了します。したがって、この特定のメソッドが開始されると、バックグラウンドで (サーバー内で) 実行を開始するスレッドを作成し、メソッドは実行を継続します。これは、数行で終了する可能性が高くなります。

私が正しければ、これを行う必要はありません。スレッドを使用せずにメソッドを呼び出すことができます。理論的には、応答に時間がかかっても問題ありません。これは、(クライアント上の) Silvelight アプリケーションが待機しないためです。Silverlight では、すべての操作が非同期です (これは、操作が独自のスレッドで実行されていることを意味します)。したがって、クライアントからサービス メソッドを呼び出すときは、コールバックが呼び出されるまで待つだけで済みます。

本当に時間がかかる場合は、Silverlight クライアントと Web サーバー間の接続をより長く維持するためのメカニズムを探す可能性が高くなります。サービス構成を変更することで考えます。

これが私が言っていることのサンプルです: https://github.com/hmadrigal/CodeSamples/tree/master/wcfria/SampleWebApplication01サンプルで は、​​クライアント側とサーバー側で異なる時間を確認できます。ボタンをクリックして、サーバーからの応答を受信するまで 30 秒待つ必要があります。

これがお役に立てば幸いです、よろしくお願いします、ハーバー

于 2011-02-04T22:15:10.580 に答える