C# 用任务替换for循环-传递变量

C# 用任务替换for循环-传递变量,c#,for-loop,task,C#,For Loop,Task,让我们有两个班: class MyClass { public string str = "something"; public int ind = 5; public MyClass() { } public void MyMethod() { //do something here } } 第二点: class ResultClass { private string resultstring;

让我们有两个班:

class MyClass
{
    public string str = "something";
    public int ind = 5;

    public MyClass()
    {

    }

    public void MyMethod()
    {
        //do something here
    }
}
第二点:

class ResultClass
{
    private string resultstring;
    private int resultint;

    public ResultClass(string resultstring, int resultint)
    {
        this.resultstring = resultstring;
        this.resultint = resultint;
    }

}
现在在主窗体中,让我们假设在窗体加载时:

private void Form1_Load(object sender, EventArgs e)
{
    List<MyClass> listMyClass = new List<MyClass>();
    List<ResultClass> listResultClass = new List<ResultClass>();
    MyClass itemMyClass1 = new MyClass();
    MyClass itemMyClass2 = new MyClass();
    listMyClass.Add(itemMyClass1);
    listMyClass.Add(itemMyClass2);
    for(int i = 0; i < listMyClass.Count; i++)
    {
        string s = listMyClass[i].str;
        int ind = listMyClass[i].ind;
        ResultClass result = new ResultClass(s, ind);
        listResultClass.Add(result);
    }
}
private void Form1\u加载(对象发送方,事件参数e)
{
List listMyClass=新列表();
List listResultClass=新建列表();
MyClass itemMyClass1=新的MyClass();
MyClass itemMyClass2=新的MyClass();
添加(itemMyClass1);
添加(itemMyClass2);
for(int i=0;i
问题是:

我想用tasks替换for循环,这样它就可以同时计算listResultClass的所有成员

到目前为止,我发现最好的方法就是这样尝试:

private void Form1_Load(object sender, EventArgs e)
    {
        List<MyClass> listMyClass = new List<MyClass>();
        List<ResultClass> listResultClass = new List<ResultClass>();
        MyClass itemMyClass1 = new MyClass();
        MyClass itemMyClass2 = new MyClass();
        listMyClass.Add(itemMyClass1);
        listMyClass.Add(itemMyClass2);


        var tasks = listMyClass.Select(t => Task<ResultClass>.Factory.StartNew(() => TestTask(listMyClass))).ToArray();
        Task.WaitAll(tasks);
        listResultClass.AddRange(tasks.Select(task => task.Result));
    }

    private ResultClass TestTask(List<MyClass> listMyClass)
    {
        string s = listMyClass[i].str; //problem here
        int ind = listMyClass[i].ind; //and here
        ResultClass result = new ResultClass(s, ind);
        return result;
    }
private void Form1\u加载(对象发送方,事件参数e)
{
List listMyClass=新列表();
List listResultClass=新建列表();
MyClass itemMyClass1=新的MyClass();
MyClass itemMyClass2=新的MyClass();
添加(itemMyClass1);
添加(itemMyClass2);
var tasks=listMyClass.Select(t=>Task.Factory.StartNew(()=>TestTask(listMyClass))).ToArray();
Task.WaitAll(任务);
listResultClass.AddRange(tasks.Select(task=>task.Result));
}
私有ResultClass测试任务(列表listMyClass)
{
字符串s=listMyClass[i].str;//这里有问题
int ind=listMyClass[i].ind;//这里
ResultClass结果=新的ResultClass(s,ind);
返回结果;
}
但我不知道如何控制(I)值。我尝试声明一个int并将其传递给TestTask,在函数末尾增加它,但它似乎不起作用(可能是因为它在同一时间被多次激发,使得int始终为0)


如何正确替换该循环?

在我看来,您只需传入
t
,因为这是您要处理的项目:

listMyClass.Select(t => Task.Run(() => TestTask(t)))
或者,您可以在
选择中获取项目的索引,并在方法中传递该索引:

listMyClass.Select
            ( (t, idx) => Task.Run
                          (() => TestTask(listMyClass, idx))
            )

在我看来,您只需要传入
t
,因为这是您要处理的项目:

listMyClass.Select(t => Task.Run(() => TestTask(t)))
或者,您可以在
选择中获取项目的索引,并在方法中传递该索引:

listMyClass.Select
            ( (t, idx) => Task.Run
                          (() => TestTask(listMyClass, idx))
            )

除了对Select方法使用适当的重写和索引外(如已接受的答案中所示),我还建议您不要阻止表单的加载事件。 让它异步

    private async void Form1_Load(object sender, EventArgs e)
    {
并在其中添加wait关键字

        var tasks = listMyClass.Select((t, i) => Task.Run(() => 
            TestTask(listMyClass, i)));
        listResultClass.AddRange(await Task.WhenAll(tasks));
    }

除了对Select方法使用适当的重写和索引外(如已接受的答案中所示),我还建议您不要阻止表单的加载事件。 让它异步

    private async void Form1_Load(object sender, EventArgs e)
    {
并在其中添加wait关键字

        var tasks = listMyClass.Select((t, i) => Task.Run(() => 
            TestTask(listMyClass, i)));
        listResultClass.AddRange(await Task.WhenAll(tasks));
    }

第二个索引对我来说非常好,谢谢!第二个索引对我来说非常好,谢谢!谢谢你改进了答案!谢谢你改进了答案!