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。我必须假设您正在实施两个部分:

  • WCF Web 服务
  • 使用 WCF 服务的 Silverlight 客户端。

因此,这意味着您有两个应用程序。在 IIS 上运行的服务,以及在 Web 浏览器上运行的 Silverlight。这些应用程序具有不同的生命周期。Silverlight 应用程序在加载到网页时开始运行,并在页面关闭(或发生异常)时终止。另一方面(在服务器端),WCF Web 服务的生命是相当有序的。您的应用程序在请求服务时开始运行,并在请求完成后终止。

在您的情况下,您的服务器请求在SearchAndStore方法完成时完成。因此,当这个特定方法启动时,您创建一个开始在后台(在服务器中)运行的线程,并且您的方法继续执行,这更有可能在几行内完成。

如果我是对的,你不需要这样做。您可以在不使用线程的情况下调用您的方法,理论上是否需要一段时间才能响应并不重要。这是因为 Silvelight 应用程序(在客户端)不会等待。在 Silverlight 中,所有操作都是异步的(这意味着它们在自己的线程中运行)。因此,当您从客户端调用服务方法时,您只需等待回调被调用。

如果确实需要很长时间,您更有可能寻找一种机制来使您的 silverlight 客户端和 Web 服务器之间的连接保持更长时间。我想通过修改服务配置。

这是我所说的示例: https://github.com/hmadrigal/CodeSamples/tree/master/wcfria/SampleWebApplication01 在示例中,您可以看到客户端和服务器端的不同时间。您单击该按钮并且必须等待 30 秒才能收到来自服务器的响应。

我希望这会有所帮助,最好的问候,赫伯

于 2011-02-04T22:15:10.580 回答