2013-08-14 4 views
1

다음 코드가 있습니다. 첫 번째 스트림에서 파일을 읽는 중이고 내용에 대한 해석을하고 두 번째 파일에 쓰는 경우,우리가 더블 스트림을 사용할 때 GUI가 고집 스럽습니다.

using (StreamReader streamReader = new StreamReader(File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))) 
using (StreamWriter streamWriter = new StreamWriter(File.Open("Compressed_" + splitFilePath[splitFilePath.Length - 1], FileMode.Create, FileAccess.Write, FileShare.ReadWrite))) 
{ 
    // Here are the interpretations of the code 
    while ((dataSize = streamReader.ReadBlock(buffer, 0, BufferSize)) > 0) 
    { 
     streamWriter.Write(.....); 
    } 
} 

수있는 사람이 다음 때라도 코드

Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => 
       { 
        // Here 
       }); 

이 : 나는 WPF의 GUI가 부착되어 큰 파일을했습니다 때, 나는 독서에 쓰기 작업을 넣어 시도하는 것이 문제 도와주세요?? 감사합니다.

+0

아마도 GUI 스레드에서 많은 데이터를 읽고 쓰고 있기 때문에 UI 작업에 반응하지 않고 IO를 수행합니다. –

답변

2

UI를 차단하지 않으려면 글쓰기를 백그라운드 스레드로 옮겨야합니다.

Task.Factory.StartNew를 통해 수행 할 수 있습니다

var task = Task.Factory.StartNew(() => 
{ 
    using (StreamReader streamReader //.. Your code 

}); 

이 의지는 기본적으로 이것은 스레드 풀 스레드에서 실행될 수. 이 작업이 완료되면 사용자 인터페이스를 업데이트해야 할 경우 다음과 같이 UI 스레드에서 계속 사용할 수 있습니다.

task.ContinueWith(t => 
{ 
    // Update UI here 
}, TaskScheduler.FromCurrentSynchronizationContext()); 
+0

답변을 주셔서 감사합니다. 작업을 수행하는 동안 인터페이스를 업데이트해야하는 경우 다른 질문을 물어볼 필요가 있습니다. 어떻게 수행 할 수 있습니까? –

+0

@RamzyAbourafeh UI 스레드로 다시 호출해야합니다. 참조 : http://reedcopsey.com/2010/03/18/parallelism-in-net-part-15-making-tasks-run-the-taskscheduler/ –

1

BeginInvoke를 사용해도 코드가 SAME UI 디스패처 스레드에서 실행되어 GUI가 정지된다는 것을 이해해야합니다. 작업을 사용하여 백그라운드에서 논리를 실행 해보십시오.