전달의 2 개 클래스 보자 :는 작업과 루프 교체 - 변수
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);
}
}
문제 :
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;
}
하지만 내가 어떻게 [I] 값을 조종하는 아무 생각이 없습니다. int를 선언하고 TestTask에 전달하여 함수 끝에서 값을 증가시키지 만 작동하지 않는 것 같습니다 (아마도 같은 시간에 여러 번 실행되어 int가 항상 0이되기 때문일 것입니다).
어떻게하면 루프를 바꿀 수 있습니까? 당신이 Select
에있는 항목의 인덱스를 얻고 하나를 전달할 수
listMyClass.Select(t => Task.Run(() => TestTask(t)))
을 또는 :
내부의 await를 키워드를 추가! – Janushoff