我想同时在同一程序中的各自线程中运行一个UWP xaml应用程序(称为NotifyIcon Notification = new NotifyIcon();
Notification.BalloonTipIcon = ToolTipIcon.Info;
Notification.BalloonTipTitle = "Please Wait";
Notification.BalloonTipText = "Creating Database...";
Notification.Visible = true;
Notification.ShowBalloonTip(2000, "Please Wait", "Creating Database...", ToolTipIcon.Info);
)和一个UWP Core应用程序(称为my_xaml_app
)。
到目前为止,我已经尝试了以下方法:
my_core_app
我没有详细介绍如何实例化my_core_app::my_core_app()
{
ViewProviderFactory viewProviderFactory;
winrt::Windows::ApplicationModel::Core::CoreApplication::Run(viewProviderFactory);
}
winrt::Windows::Foundation::IAsyncAction init_core_app()
{
co_await winrt::resume_background();
my_core_app coreApp;
}
int __stdcall wWinMain(HINSTANCE, HINSTANCE, PWSTR, int)
{
init_core_app();
winrt::Windows::UI::Xaml::Application::Start(
[](auto &&)
{
winrt::make<winrt::my_xaml_app::implementation::App>();
});
return 0;
}
和my_core_app
的细节,但是您可以假定它们确实可以正常工作,因为如果我从主线程单独启动它们,它们就可以正确启动。
在上面的代码中,my_xaml_app
可正确启动,因为它是从主线程调用的。但是my_xaml_app
无法启动,并报告以下错误:
my_core_app
WinRT originate error - 0x8001010E : 'The Application Object must initially be accessed from the multi-thread apartment.'.
The application called an interface that was marshalled for a different thread.
这是否可行?如果可以的话,怎么办?
答案 0 :(得分:-1)
要最初从主线程初始化,可以使用CoreDispatcher
以下是从 CoreDispatcher
运行应用程序的文档中的示例代码// App.cpp
...
// An implementation of IFrameworkView::Run.
void Run()
{
CoreWindow window{ CoreWindow::GetForCurrentThread() };
window.Activate();
CoreDispatcher dispatcher{ window.Dispatcher() };
dispatcher.ProcessEvents(CoreProcessEventsOption::ProcessUntilQuit);
}
// The CoreApplication::Run call indirectly calls the App::Run function above.
int __stdcall wWinMain(HINSTANCE, HINSTANCE, PWSTR, int)
{
CoreApplication::Run(App());
}
答案 1 :(得分:-1)
该错误消息显示了COM公寓如何工作的内部。一个进程只能有一个MTA套间。同一进程中不可能有两个MTA线程。
也就是说,您可以在另一个过程中启动该应用程序,这将起作用。