Silverlight 4 Ria服务和多线程

时间:2011-02-02 06:46:36

标签: multithreading wcf-ria-services objectcontext

我有一个很长时间运行的查询,需要很长时间来保持我的客户端连接。我想调用我的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);
    }
}

如何防止这种情况发生?有没有办法为新线程创建新的上下文?我真的坚持这个。

感谢。

1 个答案:

答案 0 :(得分: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秒才能从服务器接收响应。

我希望这有帮助, 最好的祝福, 数量锐减