修改多个任务使用的实例变量

时间:2014-06-10 18:18:00

标签: c# asynchronous foreach task

我需要一些处理任务的帮助。我有一个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());

2 个答案:

答案 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);
    }

另一个选项(也在上面的注释中提到)是为每个提供者创建一个新的请求对象。