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

我需要一些处理任务的帮助。 我有一个反序列化成一个类的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

上一篇: Modify instance variable used by multiple Tasks

下一篇: VB.net random numbers each to different label