2017-02-07 1 views
0

전달의 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))) 

을 또는 :

답변

1

당신이 바로 그 아이템이기 때문에 당신이 처리 할, t에 전달해야 나에게 보인다 방법에 :

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

내부의 await를 키워드를 추가! – Janushoff

1

이미 허용 대답에 도시 된 인덱스와 선택 방법의 적절한 재정의를 사용하는 외에, 나 또한 폼의로드 이벤트를 차단하지 않아야하는 것이 좋습니다 수 있습니다. , 인덱스 두 번째는 완벽하게 나를 위해 일한 덕분에

private async void Form1_Load(object sender, EventArgs e) 
    { 

비동기를 확인하고

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

답변 주셔서 감사합니다. – Janushoff