1

特定のカスタムオブジェクトに許可されている最大フィールドを見つけるための非常に単純な呼び出しを含めたい既存のRIAサービスがあります。値が変更されることはほとんどありません。必要に応じて1回だけ呼び出してから、クライアントに保持したいと思います。ただし、値を知る必要がある場合は、すぐに使用するため、同期的に知る必要があります。

私は次のことを試しましたが、.Valueこのコードブロックの実行時にサービスが実際にリクエストを行うのではなく、しばらくしてから、常に0になります。

private static readonly Lazy<int> _fieldCount =
    new Lazy<int>(() =>
        {
            const int TotalWaitMilliseconds = 2000;
            const int PollIntervalMilliseconds = 500;

            // Create the  context for the RIA service and get the field count from the server.
            var svc = new TemplateContext();
            var qry = svc.GetFieldCount();

            // Wait for the query to complete. Note: With RIA, it won't.
            int fieldCount = qry.Value;
            if (!qry.IsComplete)
            {
                for (int i = 0; i < TotalWaitMilliseconds / PollIntervalMilliseconds; i++)
                {
                    System.Threading.Thread.Sleep(PollIntervalMilliseconds);
                    if (qry.IsComplete) break;
                }
            }

            // Unfortunately this assignment is absolutely worthless as there is no way I've discovered to really invoke the RIA service within this method.
            // It will only send the service request after the value has been returned, and thus *after* we actually need it.
            fieldCount = qry.Value;

            return fieldCount;
        });

RIAサービスを使用して同期のロードオンデマンドサービス呼び出しを行う方法はありますか?または、次のいずれかを行う必要があります。1)定数をクライアントコードに含め、変更があった場合は更新をプッシュします。または2)完全に別個のサービスをホストします。これを同期的に呼び出すことができますか?

4

2 に答える 2

3

残念ながら、WCF RIA を同期的に動作させることはできません。できることは、Silverlight をホストする HTMLInitParamsのタグの に値を入れることです。<object>詳細: http://msdn.microsoft.com/en-us/library/cc189004(v=vs.100).aspx

于 2012-06-24T13:23:00.190 に答える
1

ここでの以前の回答は、数年前には正しかったかもしれませんが、今発見したばかりなので、完全に真実ではありません。await 演算子を見てください http://msdn.microsoft.com/en-us/library/hh156528.aspx

これはまさにあなたが探しているものだと思います。非同期メソッド内から呼び出すことができます (メソッドの先頭で、private async void dostuff() のように async 修飾子を使用する必要があります)。親メソッドはまだ非同期ですが、タスクへの呼び出しを待ちます。

ドメイン データ サービスからこれを行っているとします。次に例を示します。 注: DDS は IEnumerable の型を返す必要があります。DDS からデータを呼び出す前に、問題のデータを取得するプライベート タスク メソッドを次のように定義します。

private Task<IEnumerable<fieldCounts>> GetCountssAsync()
    {
        fieldCountsEnumerable_DS _context = new fieldCountsEnumerable_DS ();
        return _context.LoadAsync(_context.GetCountsQuery());
    }

次に、既存の async ria サービス メソッドまたは実際に await を使用する任意のクライアント メソッド内からそのタスクを呼び出すことができます。

IEnumerable<fieldCounts> fieldcnts = await GetCountssAsync();
enter code here

これを呼び出すメソッドが何であれ、そのメソッドはドキュメントに記載されているように非同期でなければならないことを知っておいてください。制御を呼び出し元に戻す必要があります。

于 2014-06-13T17:21:32.083 に答える