2016-07-20 3 views
0

Ich muss ein UI-Steuerelement innerhalb einer Aufgabe/Thread aktualisieren. Was mache ich hier falsch? Es wird versucht, einige Debuginformationen auf eine Seite anstatt nur auf die Visual Studio-Ausgabekonsole zu schreiben.Wie Zugriff auf TextBlock-Steuerelement von einer Aufgabe/Thread?

MySuperAppPage::MySuperAppPage(){ 
    // in main thread 
    InitializeComponent(); 
    this->myTextBlock->Text = "mainThread"; // works 

    create_task([this]() // async 
    { 
     while(true) { 
      OutputDebugString(L"thread2\n"); // works 
      this->myTextBlock->Text = "thread2"; // failed 
      Sleep(1000);   
     } 
    }); 
} 

Fehler zurückgegeben: Unbehandelte Ausnahme bei 0x00007FFB2939D01B (Windows.UI.Xaml.dll) in Test-uwp.exe: 0xC000027B: Eine anwendungs ​​interne Ausnahme aufgetreten ist (Parameter: 0x000001DDE95257E0, 0x0000000000000003).

EDIT:

Aufrufhierarchie:

KernelBase.dll!RaiseFailFastException() Unknown 
    combase.dll!RoFailFastWithErrorContextInternal2(HRESULT hrError, unsigned long cStowedExceptions, _STOWED_EXCEPTION_INFORMATION_V2 * * aStowedExceptionPointers) Line 1034 C++ 
    Windows.UI.Xaml.dll!DirectUI::ErrorHelper::ProcessUnhandledError(DirectUI::ErrorInfo & errorInfo, unsigned int fSkipFailFastIfNoErrorContext, unsigned int * pfHandled) Line 617 C++ 
    Windows.UI.Xaml.dll!DirectUI::FinalUnhandledErrorDetectedRegistration::OnFinalUnhandledErrorDetected(IInspectable * pSender, Windows::ApplicationModel::Core::IUnhandledErrorDetectedEventArgs * pArgs) Line 975 C++ 
> Windows.UI.Xaml.dll!Microsoft::WRL::Details::InvokeHelper<Microsoft::WRL::Implements<Microsoft::WRL::RuntimeClassFlags<2>,Windows::Foundation::IEventHandler<Windows::ApplicationModel::Core::UnhandledErrorDetectedEventArgs * __ptr64>,Microsoft::WRL::FtmBase,Microsoft::WRL::Details::Nil,Microsoft::WRL::Details::Nil,Microsoft::WRL::Details::Nil,Microsoft::WRL::Details::Nil,Microsoft::WRL::Details::Nil,Microsoft::WRL::Details::Nil,Microsoft::WRL::Details::Nil>,long (__cdecl*)(IInspectable * __ptr64,Windows::ApplicationModel::Core::IUnhandledErrorDetectedEventArgs * __ptr64),2>::Invoke(IInspectable * arg1, Windows::ApplicationModel::Core::IUnhandledErrorDetectedEventArgs * arg2) Line 274 C++ 
    twinapi.appcore.dll!Windows::Internal::Details::GitInvokeHelper<struct Windows::Foundation::IEventHandler<class Windows::ApplicationModel::Core::UnhandledErrorDetectedEventArgs *>,class Windows::Internal::GitPtr,2>::Invoke(struct IInspectable *,struct Windows::ApplicationModel::Core::IUnhandledErrorDetectedEventArgs *) Unknown 
    twinapi.appcore.dll!Windows::ApplicationModel::Core::UnhandledErrorInvokeHelper::Invoke(struct IInspectable *,struct Windows::ApplicationModel::Core::IUnhandledErrorDetectedEventArgs *) Unknown 
    twinapi.appcore.dll!Microsoft::WRL::InvokeTraits<2>::InvokeDelegates<class <lambda_c38a937a821308c18b1a725c966ecfa2>,struct Windows::Foundation::IEventHandler<class Windows::ApplicationModel::Core::UnhandledErrorDetectedEventArgs *> >(class <lambda_c38a937a821308c18b1a725c966ecfa2>,class Microsoft::WRL::Details::EventTargetArray *,class Microsoft::WRL::EventSource<struct Windows::Foundation::IEventHandler<class Windows::ApplicationModel::Core::UnhandledErrorDetectedEventArgs *>,struct Microsoft::WRL::InvokeModeOptions<2> > *) Unknown 
    twinapi.appcore.dll!`wil::ErrorHandlingHelpers::Instance(void)'::`2'::`dynamic atexit destructor for 'wrapper''(void) Unknown 
    twinapi.appcore.dll!Windows::ApplicationModel::Core::CoreApplication::ForwardLocalError(struct IRestrictedErrorInfo *) Unknown 
    twinapi.appcore.dll!Windows::ApplicationModel::Core::CoreApplicationFactory::ForwardLocalError(struct IRestrictedErrorInfo *) Unknown 
    combase.dll!CallErrorForwarder(void * hProcess, int fLocal, IRestrictedErrorInfo * pRestrictedErrorInfo) Line 1167 C++ 
    msvcp140_app.dll!`Concurrency::details::_ExceptionHolder::ReportUnhandledError'::`1'::catch$3() Line 331 C++ 
    vcruntime140_app.dll!_CallSettingFrame() Unknown 
    vcruntime140_app.dll!__CxxCallCatchBlock() Unknown 
    ntdll.dll!RcConsolidateFrames() Unknown 
    msvcp140_app.dll!Concurrency::details::_ExceptionHolder::ReportUnhandledError() Line 314 C++ 
    test-uwp.exe!Concurrency::details::_ExceptionHolder::~_ExceptionHolder() Line 750 C++ 
    test-uwp.exe!Concurrency::details::_Task_impl_base::~_Task_impl_base() Line 1483 C++ 
    test-uwp.exe!Concurrency::details::_Task_impl<unsigned char>::`scalar deleting destructor'(unsigned int) C++ 
    test-uwp.exe!Concurrency::details::_PPLTaskHandle<unsigned char,Concurrency::task<unsigned char>::_InitialTaskHandle<void,void <lambda>(void),Concurrency::details::_TypeSelectorNoAsync>,Concurrency::details::_TaskProcHandle>::~_PPLTaskHandle<unsigned char,Concurrency::task<unsigned char>::_InitialTaskHandle<void,void <lambda>(void),Concurrency::details::_TypeSelectorNoAsync>,Concurrency::details::_TaskProcHandle>() Line 1406 C++ 
    test-uwp.exe!Concurrency::task<unsigned char>::_InitialTaskHandle<void,void <lambda>(void),Concurrency::details::_TypeSelectorNoAsync>::`scalar deleting destructor'(unsigned int) C++ 
    test-uwp.exe!Concurrency::details::_DefaultPPLTaskScheduler::_PPLTaskChore::_Callback(void * _Args) Line 51 C++ 
    ntdll.dll!TppWorkpExecuteCallback() Unknown 
    ntdll.dll!TppWorkerThread() Unknown 
    kernel32.dll!BaseThreadInitThunk() Unknown 
    ntdll.dll!RtlUserThreadStart() Unknown 
+0

können Sie die gesamte Ausnahme posten? Könnte sein, dass Sie auf Elemente aus einem Nicht-Ui-Thread zugreifen, wenn Sie UI-Mitglieder aus einer Aufgabe ändern möchten, was implizit zu einem anderen Thread führt ... – icbytes

+0

Mögliches Duplikat von [Wie aktualisiere ich die GUI von einem anderen Thread in C#?] (http://stackoverflow.com/questions/661561/how-to-update-the-gui-from-another-thread-in-c) –

+0

@EdPlunkett Ich brauche ein C++/CLI-Beispiel, wenn möglich. –

Antwort

0

eine Arbeits C++/CLI Beispiel

MySuperAppPage::MySuperAppPage(){ 
    // in main thread 
    InitializeComponent(); 
    this->myTextBlock->Text = "mainThread"; // works 

    Windows::UI::Core::CoreDispatcher^ dispatcher; // 
    dispatcher = Windows::UI::Core::CoreWindow::GetForCurrentThread()->Dispatcher; 

    create_task([this, dispatcher]() // async 
    { 
     while(true) { 
      OutputDebugString(L"thread2\n"); // works 
      dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, 
           ref new Windows::UI::Core::DispatchedHandler(
      [this]() 
      { 
       this->myTextBlock->Text = "thread2"; // works 
      })); 
      Sleep(1000); 
     } 
    }); 
} 
+0

Gute Arbeit. Das wird funktionieren. Vielen Dank! –

Verwandte Themen