我正在编写一个 WCF 服务,它必须实现多线程才能调用另一个 3rd 方服务。
我正在使用 LINQ 创建一个“列表”并将对象列表发送给客户端。
“MyObject”有 5 个属性:
- 3 静态存储在表中
- 2 由第 3 方服务动态计算。
我需要生成线程来读取 2 个动态属性,超时时间为 30 秒。例子:
如果列表中有 6 个对象,
- 我应该生成 6 个并行异步执行的线程,它们为它们的 2 个属性中的每一个调用 3rd 方服务。
- 如果我在 30 秒内得到所有结果,我会将这 6 个具有所有属性的对象发送给客户端。
- 如果我在 30 秒内没有收到任何对象的属性,我必须将该对象的属性设置为 NULL 并将对象列表返回给客户端。
我的代码如下所示:
List<Dials> lstDial = new List<Dials>();
foreach(var c in dialsToShow)
{
int threadId;
AsyncMethodCaller caller =
new AsyncMethodCaller(MyMethodThatCalls3rdPartyService);
IAsyncResult result = caller.BeginInvoke(userName, out threadId, null, null);
while (!result.AsyncWaitHandle.WaitOne(30000, false))
avgBI = caller.EndInvoke(out threadId, result);
property4 = avgBI[0];
property5= avgBI[1];
var dashboardObj = _repository.FindQueryable<DashboardDial_Tbl>()
.Select(p => new DialDetails()
{
Id = p.DialId,
Name= p.DialName,
Type = p.DialType,
IndividualStat = property4,
GroupStat = proprty5
}).SingleOrDefault();
dials.Add(dashboardObj);
}
reponse.dialsList = dials;
调用 3rd 方服务的方法有一个委托。它看起来像这样:
public delegate List<string> AsyncMethodCaller(
string methodName, out int threadId);
private List<string> MyMethodThatCalls3rdPartyService(
string userName, out int threadId)
{
//Call the service
}
有人可以帮助我以另一种方式使用多线程来实现这一目标吗?我正在使用 .Net 4.0 和 VS2012。