2011-02-02 168 views
1

我有一个很长的运行查询,需要很长的时间来保持我的客户端连接。我想调用我的DomainService,创建一个新的工作线程,然后从服务返回,这样我的客户端就可以开始轮询以查看长时间运行的查询是否完成。Silverlight 4 Ria服务和多线程

我遇到的问题是,因为我的调用线程马上退出,所以当我的工作人员试图访问任何实体时,我得到了异常,因为在原始线程结束时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

复制 - http://stackoverflow.com/questions/4869346/polling-pattern-for-silverlight-4-wcf-ria-services/4879483 #4879483 – jweyrich 2011-02-02 20:28:05

回答

0

由于您使用的是WCF RIA。我必须假设您正在实施两个部分:

  • 一个WCF Web服务
  • 一个Silverlight客户端消耗WCF服务。

所以,这意味着你有两个应用程序。在IIS上运行的服务以及在Web浏览器上运行的Silverlight。这些应用有不同的生命周期。 Silverlight应用程序在网页中加载时开始生效,并且在页面关闭(或发生异常)时死亡。另一方面(在服务器端),WCF Web服务的生活相当类似。您的应用程序在请求服务时开始生活,并在请求完成后死亡。

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

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

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

这是我在说什么的样本: https://github.com/hmadrigal/CodeSamples/tree/master/wcfria/SampleWebApplication01 在样本可以看到在客户端和服务器端的不同的时间。您单击该按钮并等待30秒才能收到服务器的响应。

我希望这有助于 最好的问候, 数量锐减