2016-12-13 8 views
0

У меня есть решение, в котором есть как компонент Runtime Windows (C#), так и универсальное приложение (JS).Запуск IAsyncOperation из компонента Runtime Windows с использованием JavaScript

Один из моих классов в WRC имеет следующую статическую функцию:

public static IAsyncOperation<Project> Import() 
{ 
    return System.Threading.Tasks.Task.Run<Project>(async() => 
    { 
     try 
     { 
      FileOpenPicker picker = new FileOpenPicker(); 
      picker.ViewMode = PickerViewMode.List; 
      picker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary; 
      picker.FileTypeFilter.Add(".xml"); 
      StorageFile source = await picker.PickSingleFileAsync(); 

      if (source != null) 
      { 
       StorageFile destination = await ApplicationData.Current.RoamingFolder.CreateFileAsync(source.Name, CreationCollisionOption.ReplaceExisting); 
       await source.MoveAndReplaceAsync(destination); 
       return await Project.Open(source.DisplayName); 
      } 
      else 
      { 
       return null; 
      } 
     } 
     catch (Exception) 
     { 
      return null; 
     } 
    }).AsAsyncOperation<Project>(); 
} 

Я пытаюсь вызвать эту функцию из JS с помощью:

SignalOne.Data.Project.import().done(function() { 
    new Windows.UI.Popups.MessageBox("Done").showAsync(); 
} 

Однако, в то время как «Done» сообщение появляется диалоговое окно открытия файла. Если я помещаю окно сообщения в первую строку внутри попытки C#, оно также не отображается.

Я знаю, что у меня есть верхний регистр импорта на C# и в нижнем регистре импорта в JS, но так оно и происходит с Intellisense, и если я изменю его на верхний регистр в JS, он сработает.

Уверен, что мне не хватает чего-то маленького/глупого, но я не могу на него наложить.

Спасибо.

ответ

0

Как вы знаете, если мы хотим использовать метод async в компонентах Windows Runtime, мы должны использовать метод расширения WindowsRuntimeSystemExtensions.AsAsyncAction или AsAsyncOperation для переноса задачи в соответствующий интерфейс.

Вы можете использовать задачи .NET Framework (класс Task и общий класс Task) для реализации вашего асинхронного метода. Вы должны вернуть задачу, которая представляет текущую операцию, такую ​​как задача, которая возвращается из асинхронного метода, написанного на C# или Visual Basic, или задачи, которая возвращается из метода Task.Run.

Для получения дополнительной информации см. Asynchronous operations.

Также метод FileOpenPicker.PickSingleFileAsync должен запускаться в потоке пользовательского интерфейса.

В этом примере событие запускается в потоке пользовательского интерфейса. Если вы запускаете событие из фонового потока, например, в асинхронном вызове, вам нужно будет выполнить дополнительную работу, чтобы JavaScript мог обработать событие. Дополнительные сведения см. В разделе «Повышение активности компонентов Windows Runtime».

Таким образом, мы должны быть в состоянии использовать CoreWindow.GetForCurrentThread метод получения потока пользовательского интерфейса до Task асинхронной запускается, что целевая асинхронной не выполняется в потоке пользовательского интерфейса.

Например:

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

Тогда мы должны быть в состоянии использовать метод FileOpenPicker.PickSingleFileAsync в методе CoreDispatcher.RunAsync.

Например:

await m_dispatcher.RunAsync(CoreDispatcherPriority.Normal, new DispatchedHandler(async() => 
{ 
    var source = await picker.PickSingleFileAsync(); 
})); 
+0

Привет Джейден, спасибо за Ваш ответ. Когда я перехожу к: Источник храненияFile = null; Ожидание Windows.UI.Core.CoreWindow.GetForCurrentThread(). Dispatcher.RunAsync (Windows.UI.Core.CoreDispatcherPriority.Normal, новый файл Windows.UI.Core.DispatchedHandler (делегат async() { source = wait picker.PickSingleFileAsync(); })); Я получаю недопустимое исключение дескриптора окна. – SignalOne

 Смежные вопросы

  • Нет связанных вопросов^_^