Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Silverlight 4 Ria服务和多线程_Multithreading_Wcf Ria Services_Objectcontext - Fatal编程技术网

Multithreading Silverlight 4 Ria服务和多线程

Multithreading Silverlight 4 Ria服务和多线程,multithreading,wcf-ria-services,objectcontext,Multithreading,Wcf Ria Services,Objectcontext,我有一个运行很长的查询,它需要太长时间才能保持客户端的连接。我想调用我的DomainService,创建一个新的工作线程,然后从服务返回,这样我的客户端就可以开始轮询,看看长时间运行的查询是否完成 我遇到的问题是,由于我的调用线程正在立即退出,因此当我的工作线程尝试访问任何实体时,我会抛出异常,因为ObjectContext在原始线程结束时被释放 以下是我如何从Silverlight客户端创建新上下文和调用: MyDomainContext context = new MyDomainConte

我有一个运行很长的查询,它需要太长时间才能保持客户端的连接。我想调用我的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已经处理的异常

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);
    }
}
private void WorkerProc(对象o)
{
HashSet excludeList=新HashSet();
var query1=来自this.ObjectContext.Documents中的文档
在此.ObjectContext.AppliedGlobalFilters中加入筛选器
.其中(f=>f.FilterId==1)
在doc.FileExtension上等于filters.FilterValue
选择doc.FileId;
foreach(query1中的long fileId)//这里发生异常,因为
{//对象上下文已被释放。
excludeList.Add(fileId);
}
}
我怎样才能防止这种情况发生?有没有办法为新线程创建新上下文?我真的被这件事难住了


谢谢。

因为您正在使用WCF RIA。我必须假设您正在实现两个部分:

  • wcfweb服务
  • 使用WCF服务的Silverlight客户端
所以,这意味着你有两个应用程序。在IIS上运行的服务,以及在web浏览器上运行的Silverlight。这些应用程序具有不同的生命周期。 silverlight应用程序在加载到web页面时开始运行,在页面关闭(或发生异常)时停止运行。另一方面(在服务器端),WCFWeb服务生命周期相当长。当服务被请求时,应用程序开始运行,而一旦请求完成,应用程序就会停止运行

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

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

如果这真的需要很长时间,您更可能会寻找一种机制,使silverlight客户端和web服务器之间的连接保持更长时间的活动状态。我认为通过修改服务配置

下面是我要说的一个例子: 在这个示例中,您可以看到客户端和服务器端的不同时间。您单击按钮,必须等待30秒才能收到服务器的响应

我希望这有帮助, 顺致敬意,
赫伯

重复-我能说什么,我绝望了!除非这是实质性的不同,你应该编辑你原来的问题,而不是张贴一个新的。看-