UWP“名称分配器在当前上下文中不存在”

时间:2018-12-04 17:56:42

标签: c# uwp xamarin.ios xamarin.uwp

在UWP C#应用程序中,需要背景(即工作线程)线程才能使用UI线程显示图像。但是无法弄清楚如何编译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 :(得分:2)

查看代码中的using语句:

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

这根本不可能发生。 UIKit是Xamarin.iOS,特定于平台的名称空间,Windows.UI.Core是Windows特定于平台的名称空间,绝不能将二者混合在一个文件中(与#if的共享项目除外)指令,但实际情况并非如此。

Xamarin可帮助编写跨平台应用程序,但是您仍然无法在不提供平台专用API的操作系统上使用它们。 Windows使用Dispatcher作为在UI线程上运行代码的一种方式,但是此概念在使用InvokeOnMainThread方法的iOS上不可用。

因此,如果要编写特定于平台的iOS项目中的代码,则必须使用iOS API。如果您要编写特定于platfrom的UWP项目中的代码,则必须使用UWP API-Dispatcher之类的东西在那里可以正常工作。

最后,如果要在.NET Standard库中编写代码,则不能直接编写任何平台特定的代码,而必须使用dependency injection定义一个接口,在该接口后面隐藏平台特定的API的使用。

>