我要送我的自定義對象的List
(「撥號」)從我的WCF服務。這目標客戶有5個屬性:ID,名稱,類型,Individual_avg,Dept_avg 。爲標識,名稱和類型的值從表中來,但Individual_avg和dept_avg是從第三方的服務。未來的要求是:上Parallel.Foreach迴路設置超時
- 負載靜態屬性 - 編號,名稱,類型從表
- 在從第三方服務獲取其他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,名稱,類型)的空單組。我應該做些什麼改變才能使這段代碼按預期工作?
謝謝!這工作。但是,問題在於,一旦達到30秒的超時時間,它就不會返回任何對象。「如果服務需要超過30秒的響應時間,則必須只發送從表中獲取的3個屬性的對象( Id,Name,Type),並將其他兩個屬性設置爲null。「目前,雖然已在撥號上設置了ID,名稱和類型,但它正在發送一個空的「List」。 – user1550951
@ user1550951你已經在循環中設置了你的超時時間,因此它會在下一次迭代中應用(如果連接時間太長)。您還必須在連接本身(serviceResponse)中設置超時。 – varocarbas
@ user1550951我不知道您使用的連接類型。但是,如果你沒有「超時」,它會盡可能長時間地嘗試,剩下的代碼(包括你自己的超時位)將會等待。你必須做一些研究/詢問(一個新問題)如何在設置連接時處理這個問題。 timeout屬性是任何類型連接的基本配置的一部分(因此應該非常直截了當地找到它)。 – varocarbas