Microsoft MVP성태의 닷넷 이야기
.NET Framework: 165. WPF - UI 업데이트를 바로 반영하고 싶다면? (2) [링크 복사], [링크+제목 복사],
조회: 32888
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
(연관된 글이 1개 있습니다.)
WPF - UI 업데이트를 바로 반영하고 싶다면? (2)


우선 지난번 이야기를 아직 안 읽어보신 분들은 이 글의 이해를 위해 꼭 읽어보시기 바랍니다.

WPF - UI 업데이트를 바로 반영하고 싶다면?
; https://www.sysnet.pe.kr/2/0/747

아울러, 다음의 토픽도 읽어보시면 좋겠지요. ^^

WPF와 WinForm의 Shown 이벤트 시점
; https://www.sysnet.pe.kr/2/0/753

그런데, 이런 방법 외에 "마이크로소프트 직원"만이 ^^; 알 수 있는 듯한 방법이 하나 더 있습니다.^^

How can I expand items in a TreeView? - Part III
; http://bea.stollnitz.com/blog/?p=59

원래는 TreeView에 대해서 궁금한 것이 있어서 찾아보다가 우연히 보게 된 내용인데요. 아래와 같이 특정 DispatcherPriority까지의 실행이 모두 완료된 다음에 실행을 진행할 수 있게 하는 방법이 있습니다. (참고로 "Bea stollnitz" 블로그 내용이 꽤나 읽을 거리가 많습니다.)

internal static void WaitForPriority(DispatcherPriority priority)
{
    DispatcherFrame frame = new DispatcherFrame();
    DispatcherOperation dispatcherOperation = 
        Dispatcher.CurrentDispatcher.BeginInvoke(priority, 
            new DispatcherOperationCallback(ExitFrameOperation), frame);
    Dispatcher.PushFrame(frame);
    if (dispatcherOperation.Status != DispatcherOperationStatus.Completed)
    {
        dispatcherOperation.Abort();
    }
}

private static object ExitFrameOperation(object obj)
{
    ((DispatcherFrame)obj).Continue = false;
    return null;
}

눈에 익지 않은 코드라서 어려워 보이지만 전체적인 동작 방식은 단순합니다. Dispatcher.CurrentDispatcher.BeginInvoke에 전달된 ExitFrameOperation 콜백 메서드는 (해당 Dispatcher를 소유한) 스레드의 WorkItem 처리 레벨이 전달된 "priority" 인자로 되었을 때 호출되게 됩니다. 만약 그때 Continue = false를 주면 DispatcherFrame을 벗어나고, 그렇지 않으면 지속적으로 스레드는 해당 DispatcherFrame에 머물러 있게 됩니다. (좀 더 자세한 이야기는 다음 기회에!)

결국, 사용법도 동일합니다. 예를 들어 아래와 같은 코드가 있을 때,

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>
    <Button Click="button1_Click">Button</Button>
    <Label Grid.Row="1" x:Name="lblOutput" ></Label>
</Grid>

private void button1_Click(object sender, RoutedEventArgs e)
{
    this.lblOutput.Content = Guid.NewGuid().ToString();
    Thread.Sleep(5000);
}

보통, 이렇게 실행시키면 5초 동안 Label 컨트롤에는 아무 내용도 출력되지 않은 체로 화면이 먹통이 되어버립니다. 그런데, 다음과 같이 WaitForPriority를 추가하면,

private void button1_Click(object sender, RoutedEventArgs e)
{
    this.lblOutput.Content = Guid.NewGuid().ToString();
    WaitForPriority(DispatcherPriority.Background);
    Thread.Sleep(5000);
}

예상할 수 있는 것처럼 화면에는 새로운 Guid 값이 출력되고 난 후에 Thread.Sleep으로 진입하게 됩니다. 지난번과 비교해서 다소 어려운 면이 있지만 재미있게도 이 예제를 통해서 Dispatcher에 대한 이해가 깊어지니 나름 의미가 있습니다. ^^

* 첨부된 파일은 테스트 예제입니다.



[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 6/27/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 136  137  138  139  140  141  142  143  144  145  146  147  [148]  149  150  ...
NoWriterDateCnt.TitleFile(s)
1414정성태2/21/201335265개발 환경 구성: 182. JMeter로 XML 웹 서비스 호출에 대한 부하 테스트 방법파일 다운로드2
1413정성태2/19/201334998VC++: 66. Chromium 컴파일하는 방법 - 두 번째 이야기 [3]
1412정성태2/6/201336905VC++: 65. Python 소스코드를 Visual C++로 빌드하는 방법 [3]
1411정성태1/31/201352192개발 환경 구성: 181. 무료 데이터베이스 서버 성능 비교(SQL Server Express, IBM DB2 Express, MySQL, Sybase, PostgreSQL, Oracle XE) [9]
1410정성태1/31/201334070.NET Framework: 362. C# - 닷넷 응용 프로그램에서 Sybase DB 사용 [1]파일 다운로드1
1409정성태1/30/201337948.NET Framework: 361. C# - 공유기 관리 웹 페이지 인증 [4]파일 다운로드1
1408정성태1/29/201332804.NET Framework: 360. C# - 닷넷 응용 프로그램에서 DB2 Express-C 데이터베이스 사용 (2) [1]파일 다운로드1
1407정성태1/29/201331103.NET Framework: 359. C# - 닷넷 응용 프로그램에서 DB2 Express-C 데이터베이스 사용 (1)
1406정성태1/22/201325704개발 환경 구성: 180. Windows Server 2012 RC 버전을 RTM으로 업그레이드하는 방법
1405정성태1/16/201347196.NET Framework: 358. C# - 닷넷 응용 프로그램에서 MySQL(MySqlConnector) 사용 [7]파일 다운로드1
1404정성태1/15/201331762개발 환경 구성: 179. Hyper-V VM 복사는 robocopy로. [2]
1403정성태1/14/201333908.NET Framework: 357. .NET 4.5의 2GB 힙 한계 극복
1402정성태1/14/201335342오류 유형: 166. SmtpClient.Send 오류 - net_io_connectionclosed
1401정성태1/11/201333095.NET Framework: 356. (공개키를 담은) 자바의 key 파일을 닷넷의 RSACryptoServiceProvider에서 사용하는 방법 [2]파일 다운로드1
1400정성태1/10/201332081Windows: 69. 작업표시줄의 터치 키보드(Touch Keyboard) 없애는 방법 [3]
1399정성태1/9/201327575.NET Framework: 355. 닷넷 환경이 왜 C/C++보다 느릴까요? [8]
1398정성태1/8/201327641오류 유형: 165. 새로 설치한 Visual Studio 2010의 Team Explorer 실행시 비정상 종료가 된다면?
1397정성태1/3/201331486Windows: 68. 윈도우 설치 ISO 이미지를 USB 하드에 적용하는 방법 [2]
1396정성태12/27/201232897사물인터넷: 2. 넷두이노 - 4.2.0 펌웨어 업데이트 방법 [1]파일 다운로드1
1395정성태12/26/201223181.NET Framework: 354. x64 - AspCompat과 STA COM 개체가 성능에 미치는 영향
1394정성태12/25/201224374.NET Framework: 353. x86 - AspCompat과 STA COM 개체가 성능에 미치는 영향
1393정성태12/25/201225571.NET Framework: 352. x64에서 필수로 지정하도록 바뀐 STAThread 특성 [2]
1392정성태12/21/201235691사물인터넷: 1. .NET Micro Framework - 넷두이노 플러스 [7]
1391정성태12/21/201228205.NET Framework: 351. JavaScriptSerializer, DataContractJsonSerializer, Json.NET [3]파일 다운로드1
1390정성태12/20/201226667.NET Framework: 350. String 데이터를 Stream으로 변환하는 방법 [2]
1389정성태12/12/201224470.NET Framework: 349. .NET Thread 인스턴스로부터 COM Apartment 유형 확인하는 방법파일 다운로드1
... 136  137  138  139  140  141  142  143  144  145  146  147  [148]  149  150  ...