一些文章指出Windows 8开发是基于HTML的,而不是主要使用本机代码,如C或C++(直到现在)或.NET(现在,甚至更多,就像在Longhorn中一样,但从来没有了.)
这是真的?是否可以从Javascript访问核心API?Windows 8的主要API /框架是什么?
在WinForms中,几乎所有UI都是特定于线程的.您必须使用[STAThread]以便公共对话框可以工作,并且您不能(安全地)从创建它的任何线程之外的任何线程访问UI元素.从我所听到的,那是因为这就是Windows的工作方式 - 窗口句柄是特定于线程的.
在WPF中,保留了这些相同的限制,因为最终它仍然建立在相同的Windows API之上,仍然是窗口句柄(尽管主要用于顶级窗口),等等.事实上,WPF甚至使事情更具限制性,因为你甚至无法跨线程访问位图等内容.
现在一直是WinRT,一种全新的访问Windows的方式 - 一个新鲜,干净的平板.我们是否仍然坚持使用相同的旧线程限制(具体来说:只能从创建它的线程中操作UI控件),还是让他们打开它?
自从几天前发布了Windows 8消费者预览版以来,我正在使用C#开发新的WinRT(用于Metro应用程序),并且已经将我自己编写的IRC类移植到新的线程和网络中.
问题是:我的类正在运行一个线程,用于从服务器接收消息.如果发生这种情况,线程正在进行一些解析,然后触发事件以通知应用程序.然后,订阅的功能"应该"更新UI(文本块).
这是问题,线程无法更新UI,并且似乎不再可能使用.NET 4.0的调用方法.是否有更新的解决方法,甚至是更新UI的更好方法?如果我尝试从事件订阅者更新UI,我将得到Exception:
该应用程序调用了一个为不同线程编组的接口(来自HRESULT的异常:0x8001010E(RPC_E_WRONG_THREAD))
假设我有一个保存到文件的异步方法:
async Task SaveToFileAsync()
{
var file = await folder.GetFileAsync ( ...)
var stream = file.OpenFileAsync(...)
///etc
}
Run Code Online (Sandbox Code Playgroud)
现在想象SaveToFileAsync同时被调用两次.这是一个问题,因为您无法同时在同一文件上写入
如果这是一个常规方法,lock()将解决这个问题:
void SaveToFile()
{
lock(something)
{
/// code here
}
}
Run Code Online (Sandbox Code Playgroud)
但是,异步方法中不允许锁定.
当然,可以调用Monitor.Enter()或使用互斥锁,但这些对象可以使用线程,而不是任务.因此他们不是答案.
因此,由于lock()不是一个选项,如何同步多个任务?特别是,我应该编写什么代码以确保一次只调用一次"SaveToFileAsync"?
我已经下载并安装了Windows 8消费者预览版,我想弄清楚如何使用UI Automation API来从metro风格的应用程序中获取数据.
背景:我有很多自动化测试,它们使用Microsoft UI Automation API与应用程序进行交互.这些脚本是用IronRuby编写的,针对.NET 4
最初,我只想检查开始菜单是否可见(如果是,请关闭它)
根据微软的说法,普通的UI Automation API应该能够访问和控制metro风格的应用程序,但问题是,我无法弄清楚我的代码如何实际访问metro应用程序的UI?我们查看UI自动化数据的正常方式是使用UISpy,但是当我在Windows 8下运行UI间谍并启动一个metro应用程序时,没有提到它......似乎地铁应用程序(包括启动屏幕)被围住了离开桌面.
如果我在UISpy中找不到Metro应用程序,我怎样才能找到他们的自动化ID,以及如何从我的自动化测试脚本中找到它们?
我有以下代码:
// Get all of the files from the local storage directory.
var files = await folder.GetFilesAsync();
// Map each file to a stream corresponding to that file.
var streams = files.Select(async f => { return await f.OpenStreamForWriteAsync(); });
Run Code Online (Sandbox Code Playgroud)
我希望它是streams类型的,IEnumerable<Stream>但事实上它是IEnumberable<Task<Stream>>,这是我所期望的,如果我省略了await关键字.返回类型OpenStreamForWriteAsync是Task<Stream>- 肯定等待它应该产生一个Stream?
那么,为什么return await语句返回一个Task?
谢谢你的帮助.
试图await在LINQ查询中使用关键字,我得到这个:
'await'运算符只能用在初始'from'子句的第一个集合表达式中的查询表达式中,或者用在'join'子句的集合表达式中
示例代码:
var data = (from id in ids
let d = await LoadDataAsync(id)
select d);
Run Code Online (Sandbox Code Playgroud)
是不可能等待LINQ查询中的某些内容,还是需要以不同的方式构建它?
我试图延迟在WinRT中从键盘事件调用的方法(在示例中为SubmitQuery())的处理,直到一段时间内没有其他事件(在这种情况下为500毫秒).
我只想在我认为用户输入完成后运行SubmitQuery().
使用下面的代码,当Task.Delay(500,cancellationToken.Token)时,我不断收到System.Threading.Tasks.TaskCanceledException; 叫做.我在这做错了什么?
CancellationTokenSource cancellationToken = new CancellationTokenSource();
private async void SearchBox_QueryChanged(SearchBox sender, SearchBoxQueryChangedEventArgs args)
{
cancellationToken.Cancel();
cancellationToken = new CancellationTokenSource();
await Task.Delay(500, cancellationToken.Token);
if (!cancellationToken.IsCancellationRequested)
{
await ViewModel.SubmitQuery();
}
}
Run Code Online (Sandbox Code Playgroud) c# asynchronous cancellationtokensource windows-runtime cancellation-token
Universal Windows Platform是Windows 8和Windows Phone应用程序的WinRT的替代品吗?我的意思是,有一个WinRT平台专门为Windows 8开发Metro应用程序.现在,它被UWP取代,不是吗?
windows-8 windows-runtime windows-8.1 win-universal-app windows-10
我目前正在尝试新编译的绑定,并且已经达到(再次)我错过了一个难题的一个点:为什么我必须打电话Bindings.Update?到现在为止,我认为实施 INotifyPropertyChanged已经足够了?
在我的例子中,如果我调用这个神秘的方法(由编译的绑定自动生成),GUI只显示正确的值.
我正在使用具有以下(此处简化的)xaml语法的用户控件:
<UserControl>
<TextBlock Text="x:Bind TextValue"/>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
where TextValue是此用户控件的简单依赖项属性.在页面中,我将此控件用作:
<Page>
<SampleControl TextValue="{x:Bind ViewModel.Instance.Name}"/>
</Page>
Run Code Online (Sandbox Code Playgroud)
哪里:
ViewModel是一个在InitializeComponent()运行之前设置的标准属性Instance 是一个简单的实现对象 INotifyPropertyChanged加载后Instance,我提出了一个属性更改事件Instance.我甚至可以调试到TextValue用户控件的depency属性获取正确值的行 - 但是没有显示任何内容.只有在我打电话时Bindings.Update(),才会显示该值.我在这里错过了什么?
更新
我也没办法{x:Bind ... Mode=OneWay}.
更多代码
Person.cs:
using System.ComponentModel;
using System.Threading.Tasks;
namespace App1 {
public class Person : INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged;
private string name;
public string Name { get {
return this.name;
}
set …Run Code Online (Sandbox Code Playgroud) windows-runtime ×10
c# ×5
windows-8 ×3
async-await ×2
asynchronous ×2
c#-5.0 ×1
linq ×1
task ×1
winapi ×1
windows-10 ×1
windows-8.1 ×1
winrt-async ×1
winrt-xaml ×1