2013-08-15 3 views
1

Async Await 기능을 배우고 실험하고 있습니다.비동기 대기 및 작업. 내가 잘못하고있는 것

 //first select the direcgtory in this event. Then called the async function..to be written 
     if (folderBrowserDialog1.ShowDialog() == DialogResult.OK) 
     { 
      foldername = folderBrowserDialog1.SelectedPath; 
     } 
     // CreateFilesParellel(); 
     var x = CreateAsync(); 
다음

같은 기능 CreateAsync는 모습입니다 : 모드 상세 그래서 여기 여기

async Task<int> CreateAsync() 
    { 
     string fileType; 
     List<Task> tasks = new List<Task>(); 
     //get the files in the existing directory. 
     var files = Directory.GetFiles(foldername); 

     fileType = Path.GetExtension(files[0]); 
     var filepath = Path.GetFullPath(files[0]); 
     string d = Path.GetDirectoryName(files[0]); 
     var ss = Path.GetFileNameWithoutExtension(files[0]); 
     var progress = new Progress<string>(); 
     Stopwatch sw = new Stopwatch(); 
     sw.Start(); 
     for (int i = 0; i < 100000; i++) 
     { 

      Action act =() => 
      { 
       File.Copy(files[0], d + "\\" + ss + i.ToString() + fileType); 
      }; 

      //await File.Copy(files[0], d + "\\" + ss + i.ToString() + fileType); 
      Task t = new Task(act); 
      tasks.Add(t); 
      // t.Start(); 
      progress.ProgressChanged += (s, e) => 
      { 

       textBox1.Text = System.Environment.NewLine; 
       textBox1.Text = "Creating file = " + e; 

      }; 
     } 

     await Task.WhenAll(tasks); 



     sw.Stop(); 
     string ExecutionTimeTaken = string.Format("Minutes :{0}\nSeconds :{1}\n Mili seconds :{2}", sw.Elapsed.Minutes, sw.Elapsed.Seconds, sw.Elapsed.TotalMilliseconds); 

     MessageBox.Show(ExecutionTimeTaken); 
     return 0; 


    } 

이동이 질문이 코드를 호출하는 버튼 클릭 이벤트가 있습니다. 이 코드를 실행할 때 아무 일도 일어나지 않습니다. 의미 파일이 생성되지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 아니면 나는 무엇을 놓치고 있습니까?

+0

http://www.microsoft. com/ko-us/download/details.aspx? id = 19957,이 문서를 검토하십시오. 나는 특히 유용하다는 것을 알았다. – Anupam

답변

6

Task을 절대로 시작하지 마십시오.

일반적으로 작업을 만들려면 new Task가 아닌 Task.Run을 사용해야합니다. 말했다되고 그건

// Replace: 
// Task t = new Task(act); 
// tasks.Add(t); 

// With: 
tasks.Add(Task.Run(act)); 

,이 가능성이 병렬 처리 (여러 작업을 만드는) 이러한 유형의 좋은 후보가 아닙니다. 순수한 디스크 IO을 수행하고 있기 때문에 드라이브 자체에 병목 현상이 발생할 가능성이 높습니다.

당신은 가능성이 아닌 비동기, 직렬 루틴 등이 루틴을 떠나 그냥 전화 사이트에 하나의 Task.Run에 포장 더 나을 것 :

//first select the direcgtory in this event. Then called the async function..to be written 
    if (folderBrowserDialog1.ShowDialog() == DialogResult.OK) 
    { 
     foldername = folderBrowserDialog1.SelectedPath; 
    } 

    int result = await Task.Run(CreateFiles); 
+0

입력 해 주셔서 감사합니다. 나는 Parallel.Foreach와 비동기를 기다리는 것과의 차이를 이해하려고 노력했다. 나는 디스크 I/O 때문에 이것이 작업을위한 좋은 후보자가 아니기 때문에 실현합니다. 난 그냥 아무것도 이상한 생각할 수있다 – Waddaulookingat

+0

@Waddaulookingat 일반적으로 순수한 디스크 I/O는 병렬 처리되지 않습니다 (플래터가 너무 자주 튀어 나오므로 일반적으로 병렬로 느리게 실행됩니다) –