UWP "The name dispatcher does not exist in the current context"
UWP "The name dispatcher does not exist in the current context"
在 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;
}
最新方法出错
查看您代码中的 using
语句:
using UIKit;
...
using Windows.UI.Core;
这是不可能发生的。 UIKit
是一个 Xamarin.iOS 特定于平台的命名空间,Windows.UI.Core
是 Windows 特定于平台的命名空间,这两者绝不能混合在一个文件中(共享项目除外)使用 #if
指令,但这里不是这种情况)。
Xamarin 有助于编写跨平台应用程序,但您仍然无法在 OS 上使用特定于平台的 API,它们在这些 API 上不可用。 Windows 将 Dispatcher
作为 UI 线程上 运行 代码的一种方式,但此概念在 iOS 上不可用,它使用 InvokeOnMainThread
方法代替。
因此,如果您正在编写特定于平台的 iOS 项目中的代码,则必须使用 iOS API。如果您正在编写特定于平台的 UWP 项目中的代码,则必须使用 UWP API - Dispatcher
之类的东西在那里可以正常工作。
最后,如果您在 .NET Standard 库中编写代码,则不能直接编写任何特定于平台的代码,必须使用 dependency injection 定义一个接口,在该接口后面隐藏平台特定 API 的使用。
在 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;
}
最新方法出错
查看您代码中的 using
语句:
using UIKit;
...
using Windows.UI.Core;
这是不可能发生的。 UIKit
是一个 Xamarin.iOS 特定于平台的命名空间,Windows.UI.Core
是 Windows 特定于平台的命名空间,这两者绝不能混合在一个文件中(共享项目除外)使用 #if
指令,但这里不是这种情况)。
Xamarin 有助于编写跨平台应用程序,但您仍然无法在 OS 上使用特定于平台的 API,它们在这些 API 上不可用。 Windows 将 Dispatcher
作为 UI 线程上 运行 代码的一种方式,但此概念在 iOS 上不可用,它使用 InvokeOnMainThread
方法代替。
因此,如果您正在编写特定于平台的 iOS 项目中的代码,则必须使用 iOS API。如果您正在编写特定于平台的 UWP 项目中的代码,则必须使用 UWP API - Dispatcher
之类的东西在那里可以正常工作。
最后,如果您在 .NET Standard 库中编写代码,则不能直接编写任何特定于平台的代码,必须使用 dependency injection 定义一个接口,在该接口后面隐藏平台特定 API 的使用。