我需要一些处理任务的帮助。我有一个XML字符串,它被反序列化为一个类。该类本身包含一个属性,例如rssProvider设置为MSN或YAHOO等唯一值。但是,在此字段中可以有多个用a分隔的值。
我在多个任务中使用这个反序列化的类实例。但是,在此任务中调用的函数只能使用一个rssProvider值,因此我对该字符串进行了拆分,并创建了一个创建任务的foreach循环。
在任务本身中,我调用的函数需要完整的对象,但需要一个rssProvider。但是,当我将该属性的值更改为foreach中的值时,其他任务将失败,因为它们将从首先运行的任务中获得相同的单个值。
我应该如何重构逻辑?谢谢!
我的代码:
List<Task<ResponseOBJ>> tasks = new List<Task<ResponseOBJ>>();
// get List of rssProviders
string[] providers = request.requestBody.rssProvider.Split(',');
//go through each provider
foreach (string provider in providers)
{
Task<ResponseOBJ> task = Task.Factory.StartNew<ResponseOBJ>(() =>
{
request.requestBody.rssProvider = provider;
doStuff(request);
}
tasks.Add(task);
}
Task.WaitAll(tasks.ToArray());
答案 0 :(得分:0)
我会在您的Request
对象中创建一个复制构造函数,复制原始Request
的内容并创建一个新的内容:
public class Request
{
public Request(Request oldRequest)
{
// initalize new request from the old
}
}
然后更改我的代码以按任务创建新请求:
List<Task<ResponseOBJ>> tasks = new List<Task<ResponseOBJ>>();
// get List of rssProviders
string[] providers = request.requestBody.rssProvider.Split(',');
//go through each provider
foreach (string provider in providers)
{
Task<ResponseOBJ> task = Task.Factory.StartNew<ResponseOBJ>(() =>
{
request.requestBody.rssProvider = provider;
var newRequest = new Request(request);
doStuff(newRequest);
}
tasks.Add(task);
}
Task.WaitAll(tasks.ToArray());
答案 1 :(得分:0)
一种选择可能是将doStuff(request)
更改为doStuff(request, provider)
并删除第request.requestBody.rssProvider = provider;
行,然后相应地更改doStuff
。
foreach (string provider in providers)
{
Task<ResponseOBJ> task = Task.Factory.StartNew<ResponseOBJ>(() =>
{
doStuff(request, provider);
}
tasks.Add(task);
}
另一个选项(也在上面的注释中提到)是为每个提供者创建一个新的请求对象。