UWP: запросить доступ к буферу обмена из фоновой задачи
Я разрабатываю приложение, которое вставляет содержимое в буфер обмена из его фоновой задачи.
public sealed class ToastBackgroundTask : IBackgroundTask {
public void Run(IBackgroundTaskInstance taskInstance) {
//Inside here developer can retrieve and consume the pre-defined
//arguments and user inputs;
var toastArgs = taskInstance.TriggerDetails as ToastNotificationActionTriggerDetail;
var argument = toastArgs.Argument;
SetClipbordContent(toastArgs.Argument);
}
public static void SetClipbordContent(string text) {
var dataPackage = new DataPackage();
dataPackage.SetText(text);
Clipboard.SetContent(dataPackage);
}
}
Но когда я выполняю строку
Clipboard.SetContent(dataPackage);
поднять это исключение:
The activation of a single-threaded class from MTA is not supported.
(Exception from HRESULT: 0x8000001D)
Обычный обходной путь для обработки этого secario в классическом.Net Framework - это использование класса Thread для выполнения этой части кода в контексте STA ( C# Clipboard.GetText ()), но я не знаю, как это сделать в UWP.
2 ответа
Я использовал это в прошлом для выполнения в потоке пользовательского интерфейса из фонового потока...
await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () => {
// Do something...
}
Полный ответ на основе ответа @Edd:
using Windows.ApplicationModel.Core;
using Windows.UI.Core;
...
public static void SetClipbordContent(string text) {
await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
DataPackage dataPackage = new DataPackage();
dataPackage.RequestedOperation = DataPackageOperation.Copy;
dataPackage.SetText(text);
Clipboard.SetContent(dataPackage);
});
}