2010-02-09 4 views
5

다른 스레드에서 양식을 만들고 사용자가 주 스레드에서 일부 작업을 수행 할 때까지 계속 실행해야합니다 (단추를 클릭하십시오).wpf 메서드를 사용하여 응용 프로그램 메시지 루프를 시작하십시오.

은 현재 스레드에서 응용 프로그램 메시지 루프를 시작

System.Windows.Forms.Application.Run(new ApplicationContext()); 

을 사용하여이 작업을 수행하는 것은 매우 어려운 일이 아니다. 그러나이 솔루션을 사용하려면 wpf 네임 스페이스가 아닌 System.Windows.Forms 네임 스페이스를 사용해야합니다.

이 목표를 달성하기위한 wpf- 방법을 알고 있습니까? =)

P. 응용 프로그램 메시지 루프를 시작하지 않고 스레드는 마지막 표현식을 처리 한 후에 이미 종료됩니다. 따라서 양식은 잠시 동안 만 나타나고 닫힙니다. ? 블로그에서 = (

답변

4

사용 System.Windows.Threading.Dispatcher.Run()

-1

합니까 도움말

Application.DoEvents in WPF Revisited

코드 추출물 :

using System; 
using System.Threading; 
using System.Windows; 
using System.Windows.Threading; 

namespace Sheva.Windows 
{ 
    /// <summary> 
    /// Designates a Windows Presentation Foundation application with added functionalities. 
    /// </summary> 
    public class WpfApplication : Application 
    { 
     /// <summary> 
     /// Processes all messages currently in the message queue. 
     /// </summary> 
     /// <remarks> 
     /// This method can potentially cause code re-entrancy problem, so use it with great care. 
     /// </remarks> 
     public static void DoEvents() 
     { 
      Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new ThreadStart(delegate { })); 
     } 
    } 
} 
+0

아니요, (= – user101375

4

그리고, 또한있다 Dispatcher.PushFrame

이것은 매우 유용하다. 예를 들어 진행 대화 상자가 화면에 표시되는 등의 중지 기준이 될 때까지 messageloop을 실행할 수 있습니다.

+0

매우 흥미로운 방법입니다. 사용 예가 있습니까? – user101375

+0

이전 회사에서 사용하기에 편리하지 않습니다. 일반적으로 DispatcherFrame을 작성한 것 같습니다. 그런 다음 대화 상자 창을 만들고 DispatcherFrame 객체에 대한 참조를 제공 한 다음 PushFrame을 호출합니다. 처리가 완료되거나 사용자가 취소하면 DispatcherFrame의 Continue 속성을 false로 설정합니다. 스레드 코드에서 먼저 배경 스레드를 취소하고 UI 스레드가 실제로 취소되었다는 신호를 기다리고 해당 이벤트에서 Continue = false를 수행하십시오. –

+0

'Dispatcher.Run'은'Dispatcher.PushFrame (new DispatcherFrame()); '을 호출합니다. 그래서 똑같습니다. – NtFreX

관련 문제