2011-02-02 196 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秒才能收到服務器的響應。

我希望這有助於 最好的問候, 數量銳減