修改多个任务使用的实例变量
我需要一些处理任务的帮助。 我有一个反序列化成一个类的XML字符串。 这个类本身包含一个属性,例如rssProvider,它被设置为像MSN或YAHOO这样的唯一值。 但是,在此字段中,可以有多个用分隔符分隔的值。
我在多个任务中使用这个反序列化的类实例。 然而,在这个任务中调用的函数只能使用一个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());
我会在您的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());
一种选择可能是将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);
}
另一个选项(也在上面的评论中提到)是为每个提供者创建一个新的请求对象。
链接地址: http://www.djcxy.com/p/52795.html