Program Club

WinRT의 UI 스레드에서 코드 실행

proclub 2020. 11. 16. 22:23
반응형

WinRT의 UI 스레드에서 코드 실행


WinRT (Windows 8 Metro)의 UI 스레드에서 코드를 어떻게 실행할 수 있습니까?

Invoke방법은 존재하지 않습니다.


UI가 아닌 스레드에서 CoreWindow 를 직접 가져 오는 것이 더 쉽습니다 . 다음 코드는 경우에도, 어디에서나 작동 GetForCurrentThread()또는 Window.Current반환 널 (null) .

CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
    <lambda for your code which should run on the UI thread>);

예를 들면 :

CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
    () =>
    {
        // Your UI update code goes here!
    });

Windows.ApplicationModel.Core네임 스페이스 를 참조해야 합니다.

using Windows.ApplicationModel.Core;

사용하다:

UI 스레드에서 다음을 실행합니다.

var dispatcher = Windows.UI.Core.CoreWindow.GetForCurrentThread().Dispatcher;

백그라운드에서 (비 UI 스레드)

dispatcher.RunAsync(DispatcherPriority.Normal, 
    <lambda for your code which should run on the UI thread>);

CP 및 이후 빌드 모두에서 작동합니다.


사용하다:

this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => Frame.Navigate(typeof(Welcome), this));

그것은 나를 위해 작동합니다.


이것은 제 생각에 훨씬 쉬운 방법입니다.

UI와 연결된 TaskScheduler를 가져옵니다.

    var UISyncContext = TaskScheduler.FromCurrentSynchronizationContext();

그런 다음 새 작업을 시작하고 위의 UISyncContext에서.

    Task.Factory.StartNew(() => { /* Do your UI stuff here; */}, new System.Threading.CancellationToken(), TaskCreationOptions.PreferFairness, UISyncContext);

DispatcherTimer 도 옵션입니다.

Xaml-designer에서 실행해야하는 코드에 사용했습니다 (CoreWindow.Dispatcher, ... UWP-designer에서는 사용할 수 없음).

var localTimer = new DispatcherTimer
{
    Interval = TimeSpan.FromMilliseconds(0)
};
localTimer.Tick += (timer, e) =>
{
    (timer as DispatcherTimer).Stop();
    action();
};
localTimer.Start();

면책 조항 :
다른 모든 것이 실패 할 경우 이것이 최후의 수단이되어야한다는 점에 유의해야합니다.


UWP에서 CaptureElement 컨트롤 (XAML에 정의 됨)의 Source 속성을 설정하는 데 문제가있었습니다. Page_Loaded를 통해 호출 된 코드에서 설정하려고 했음에도 불구하고 다른 스레드에서 준비되는 것에 대해 불평했습니다. 이벤트 핸들러. 나는 이것을 사용하여 해결했습니다.

previewControl.Dispatcher.TryRunAsync(CoreDispatcherPriority.Normal, () => {
   previewControl.Source = _mediaCapture;
}).GetAwaiter().GetResult();

참고 URL : https://stackoverflow.com/questions/10579027/run-code-on-ui-thread-in-winrt

반응형