UWP "Диспетчер имен не существует в текущем контексте" - PullRequest
0 голосов
/ 04 декабря 2018

В приложении UWP C # нужен фоновый (т. Е. Рабочий) поток, чтобы использовать поток пользовательского интерфейса для отображения изображения.Но не могу понять, как скомпилировать Dispatcher.RunAsync().

using Foundation;
using System;
using UIKit;

using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Timers;
using System.Threading;
using System.Windows.Threading;                 <<<<<<<<<<  gets error
using Windows.UI.Core;                          <<<<<<<<<<  gets error

public async static void process_frame()
{

    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    {
        // "the name dispatcher does not exist in current context"
        //UI code here:
        display_frame();
    });
}


public void display_frame()
{
    var data = NSData.FromArray(System_Hub_Socket.packet_frame_state.buffer);

    UIImageView_camera_frame.Image = UIImage.LoadFromData(data);
}

Последний метод

public async static void process_frame( /* ax obsolete: byte[] camera_frame_buffer, int frame_size_bytes */  )
{
    await Task.Run( () => { viewcontroller.display_frame(); } );
}


// [3]
// Copies latest frame from camera to UIImageView on iPad.
// UI THREAD

public Task display_frame()
{
  var data = NSData.FromArray ( System_Hub_Socket.packet_frame_state.buffer);        
  <<<<<< ERROR 

  UIImageView_camera_frame.Image = UIImage.LoadFromData( data );

  return null;
}

Ошибка последнего метода

enter image description here

1 Ответ

0 голосов
/ 05 декабря 2018

Глядя на операторы using в вашем коде:

using UIKit;
...
using Windows.UI.Core; 

Этого просто не может быть.UIKit - это пространство имен Xamarin.iOS, специфичное для платформы, а Windows.UI.Core - пространство имен, специфичное для платформы Windows, и ни в коем случае нельзя смешивать эти два в одном файле (за исключением общего проекта с директивами #if, но этоздесь дело не в этом).

Xamarin помогает писать кроссплатформенные приложения, но вы по-прежнему не можете использовать API для конкретных платформ в ОС, для которых они недоступны.В Windows Dispatcher используется для запуска кода в потоке пользовательского интерфейса, но эта концепция недоступна в iOS, где вместо этого используется метод InvokeOnMainThread.

Так что, если вы пишете код, который находится на платформе- конкретный проект iOS, вы должны использовать iOS API.Если вы пишете код в платформенном проекте UWP, вы должны использовать API UWP - такие вещи, как Dispatcher, будут работать без проблем.

Наконец, если вы пишете код в .NET Standardбиблиотека, вы не можете написать какой-либо специфичный для платформы код напрямую и должны использовать внедрение зависимостей , чтобы определить интерфейс, за которым вы скрываете использование платформо-зависимых API.

...