Silverlightの同期ADO.NETの呼び出しのDataServices
-
20-08-2019 - |
質問
私は、SilverlightアプリケーションでADO.NETののDataServicesを使用していますとSilverlightライブラリがのIQueryableのToListメソッド()の呼び出しをサポートしていないので、私はこの問題を回避拡張メソッドを作成することは可能かもしれないと思った)(SilverlightToListと呼ばれます。以下に示すように、この方法では、私は私のコンテキストにBeginExecuteメソッドを呼び出しています:
var result = context.BeginExecute<T>(currentRequestUri,null,context);
result.AsyncWaitHandle.WaitOne();
return context.EndExecute<T>(result).ToList();
問題は、私はWAITONE()メソッドを呼び出したとき、これはデッドロックにつながるということです。これは、SilverlightでADO.NETののDataServicesの制限ですか?これを回避するには、おそらくありますか?
解決 2
私は以来のこのポストを見つけました任意のmanaged-> UnManaged->マネージドマーシャリングがWAITONEメソッドの呼び出しがハングしている理由を説明するUIスレッド上で起こることを言うMSDNフォーラム...
他のヒント
私は敗北に管理している(:P)そうのようなSilverlightで非同期モンスターます:
var ctx = new ModelEntities(new Uri("http://localhost:2115/Data.svc"));
ManualResetEvent m1 = new ManualResetEvent(false);
ManualResetEvent m2 = new ManualResetEvent(false);
var q1 = (DataServiceQuery<Department>)(from e in ctx.Department select e);
var q2 = (DataServiceQuery<Person>)(from e in ctx.Person select e);
Department[] r1 = null;
Person[] r2 = null;
q1.BeginExecute(r =>
{
try { r1 = q1.EndExecute(r).ToArray(); }
finally { m1.Set(); }
}, null);
q2.BeginExecute(r =>
{
try { r2 = q2.EndExecute(r).ToArray(); }
finally { m2.Set(); }
}, null);
ThreadPool.QueueUserWorkItem((o) =>
{
WaitHandle.WaitAll(new WaitHandle[] { m1, m2 });
// do your thing..
});
基本ideeaは待機オブジェクトへの参照を持っているでしょうウェイタースレッド(最後のブロック)を生み出すことです。他の人がこのサイトや他のサイトで先に述べたように、これはデッドロックになりますので、あなたのWaitAllの呼び出しは、呼び出し元のメソッド/スレッドに入れないでください。
のスレッドが起動されていないため、この方法は終了し、子スレッドのWaitAllコール待機を終了するための方法が終了していないまで、デッドロックが発生します。
しかし、上記の私の場合にはWaitAllは、別のスレッド上ではありませんので。
PS:代わりに、R1とR2は、データまたはを保持する参照をキャプチャ使用しています//あなたのもののラインの場所を行うコードの結果が失敗した場合はnull
。Silverlightはおそらく、同期何かを好きでするつもりはない、とそれだけで再生するスレッドを1つ持つことができる - と、それはそれを共有することがあります。そして、ホストのために利用可能な唯一のスレッドは、ブラウザが提供するものです。
Silverlightのすべてのサービス呼び出しは非同期でなければなりません。
:このような - だから、結果を得るためにコールバックを定義する必要がありますcontext.BeginExecute<T>(currentRequestUri, resultCallback, context);
private void resultCallback(IAsyncResult asyncResult)
{
DataServiceContext context = asyncResult.AsyncState as DataServiceContext;
var result = context.EndExecute<T>(asyncResult);
// Do whatever you need with the result here
}
ここでMSDNで良いの参照です: http://msdn.microsoft.com/en-私たち/ライブラリ/ cc838191(VS.95).aspxのの