我有一个很长时间运行的查询,需要很长时间来保持我的客户端连接。我想调用我的DomainService,创建一个新的工作线程,然后从服务返回,以便我的客户端可以开始轮询以查看长时间运行的查询是否完成。
我遇到的问题是,由于我的调用线程正在立即退出,当我的worker尝试访问任何实体时,我会抛出异常,因为当原始线程结束时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已经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);
}
}
如何防止这种情况发生?有没有办法为新线程创建新的上下文?我真的坚持这个。
感谢。
答案 0 :(得分:0)
因为你正在使用WCF RIA。我必须假设你实现了两个部分:
因此,这意味着您有两个应用程序。在IIS上运行的服务,以及在Web浏览器上运行的Silverlight。这些应用具有不同的生命周期。 Silverlight应用程序在网页中加载时开始生效,当页面关闭(或发生异常)时它会死亡。另一方面(在服务器端),WCF Web服务生命非常类似。您的应用程序在请求服务时开始生效,并在请求完成后终止。
在您的情况下,当 SearchAndStore 方法完成时,服务器请求即告结束。因此,当这个特定的方法启动时,你创建一个开始在后台(在服务器中)运行的线程,并且你的方法继续执行,这更有可能在几行中完成。
如果我是对的,你不需要这样做。您可以在不使用线程的情况下调用方法,理论上如果需要一段时间来响应并不重要。这是因为Silvelight应用程序(在客户端上)不会等待。在Silverlight中,所有操作都是异步的(这意味着它们在自己的线程中运行)。因此,当您从客户端调用服务方法时,您只需要等到调用回调。
如果真的需要很长时间,那么您更有可能寻找一种机制来保持Silverlight客户端和Web服务器之间的连接更长时间。我想通过修改服务配置。
以下是我所说的一个示例: https://github.com/hmadrigal/CodeSamples/tree/master/wcfria/SampleWebApplication01 在示例中,您可以在客户端和服务器端看到不同的时间。单击该按钮,必须等待30秒才能从服务器接收响应。
我希望这有帮助, 最好的祝福, 数量锐减