2013-09-21 25 views
1

我要送我的自定義對象的List「撥號」)從我的WCF服務。這目標客戶有5個屬性:ID,名稱,類型,Individual_avg,Dept_avg 。爲標識,名稱和類型的值從表中來,但Individual_avg和dept_avg是從第三方的服務。未來的要求是:上Parallel.Foreach迴路設置超時

  1. 負載靜態屬性 - 編號,名稱,類型從表
  2. 在從第三方服務獲取其他2個屬性值的WCF服務中調用一個方法。

我必須在30秒後超時到第三方服務的調用。也就是說,如果服務需要超過30秒的響應時間,我必須發送的對象只有從表中獲取的3個屬性( Id,Name,Type),並將其他2個屬性設置爲null。例如,在List中有5 Dials。產生5個線程來調用第三方服務來獲取2個屬性。如果在得到2 Dials的值後發生超時,則發送List,其中包含爲這2個Dials設置的所有屬性,並且僅爲其他3個設置Id,Name和Type撥號。我有以下代碼來實現它。

public DialResponse GetDials(DialRequest req) 
{ 
    DialResponse response = new DialResponse(); 
    var indiDials = new List<DialDetails>(); 
    foreach (var c in indiDialIdToShow) 
    { 
     var indiObj = _repository.FindQueryable<DashboardDial_Tbl>().Where(p => p.DialId == c.DialIdToShow && p.IsActive == true).Select(p => new DialDetails() 
      { 
       Id = p.DialId, 
       Name = p.DialName, 
       Type = p.DialType, 
      }).SingleOrDefault(); 
     indiDials.Add(indiObj); 
    } 
var timeout = 30000; // 30 seconds 
var cts = new CancellationTokenSource(); 
var token = new CancellationToken(); 
token = cts.Token; 
var myOptions = new ParallelOptions { CancellationToken = cts.Token }; 
using (var t = new Timer(_ => cts.Cancel(), null, timeout, -1)) 
{ 
    Parallel.ForEach(indiDials, myOptions, c => 
    { 
     DialDetails newDial = c; 
     ReadConfig(c.Id, userName, ref newDial); 
     //send a reference to the "dial" object and set the 2 properties on the object 

    }); 
} 
response.DialsList = indiDials; 
} 

private void ReadConfig(string userName,ref DialDetails dialObj) 
{ 
    //call the 3rd party service 
    dialObj.Individual_avg = serviceResponse.someValue; 
    dialObj.dept_avg = serviceResponse.anotherValue; 
} 

要測試「超時」的功能,我把在"ReadConfig"Thread.Sleep(40000) method.This返回「撥號」,而不是發送「撥號」的只有3個屬性(ID,名稱,類型)的空單組。我應該做些什麼改變才能使這段代碼按預期工作?

回答

1

ReadConfig正在本地執行修改,因此indiDials未更新。您可以將其轉換爲函數以返回修改的項目。示例代碼:

private DialDetails ReadConfig(string userName,ref DialDetails dialObj) 
{ 
    //call the 3rd party service 
    dialObj.Individual_avg = serviceResponse.someValue; 
    dialObj.dept_avg = serviceResponse.anotherValue; 

    retun dialObj; 
} 

而且從環這樣稱呼它的List修改:

indiDials[indiDials.IndexOf(newDial)] = ReadConfig(userName, ref newDial); 
+0

謝謝!這工作。但是,問題在於,一旦達到30秒的超時時間,它就不會返回任何對象。「如果服務需要超過30秒的響應時間,則必須只發送從表中獲取的3個屬性的對象( Id,Name,Type),並將其他兩個屬性設置爲null。「目前,雖然已在撥號上設置了ID,名稱和類型,但它正在發送一個空的「List」。 – user1550951

+0

@ user1550951你已經在循環中設置了你的超時時間,因此它會在下一次迭代中應用(如果連接時間太長)。您還必須在連接本身(serviceResponse)中設置超時。 – varocarbas

+0

@ user1550951我不知道您使用的連接類型。但是,如果你沒有「超時」,它會盡可能長時間地嘗試,剩下的代碼(包括你自己的超時位)將會等待。你必須做一些研究/詢問(一個新問題)如何在設置連接時處理這個問題。 timeout屬性是任何類型連接的基本配置的一部分(因此應該非常直截了當地找到它)。 – varocarbas