我必须从我的 WCF 服务向客户端发送一个List
自定义对象(“Dial”)。这个对象有 5 个属性:Id、Name、Type、Individual_avg、Dept_avg。Id、Name 和 Type 的值来自表,但 Individual_avg 和 dept_avg 来自第 3 方服务。要求是:
- 从表中加载静态属性 - Id、Name、Type
- 在 WCF 服务中调用从 3rd 方服务获取其他 2 个属性值的方法。
我必须在 30 秒后超时对第 3 方服务的调用。也就是说,如果服务需要超过 30 秒的时间来响应,我必须发送仅从表中获取的 3 个属性(Id、Name、Type)的对象并将其他 2 个属性设置为 null。例如,有 5Dials
个List
。生成 5 个线程以调用 3rd 方服务以获取 2 个属性。如果在获取 2 的值后发生超时Dials
,则发送List
为这 2 个设置的所有属性,Dials
并且仅为其他 3 个 Dials 设置 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;
}
为了测试“超时”功能,我放置了一个Thread.Sleep(40000)
in"ReadConfig"
方法。这将返回一个空的“拨号”列表,而不是发送仅设置 3 个属性(Id、Name、Type)的“拨号”。我应该进行哪些更改才能使这段代码按预期工作?