クライアントの接続を維持するのに時間がかかりすぎる非常に長時間実行されるクエリがあります。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);
}
}
どうすればこれを防ぐことができますか? 新しいスレッドの新しいコンテキストを作成する方法はありますか? 私は本当にこれにこだわっています。
ありがとう。