WinRT是否仍然具有相同的旧UI线程限制?

Joe*_*ite 16 multithreading windows-runtime

在WinForms中,几乎所有UI都是特定于线程的.您必须使用[STAThread]以便公共对话框可以工作,并且您不能(安全地)从创建它的任何线程之外的任何线程访问UI元素.从我所听到的,那是因为这就是Windows的工作方式 - 窗口句柄是特定于线程的.

在WPF中,保留了这些相同的限制,因为最终它仍然建立在相同的Windows API之上,仍然是窗口句柄(尽管主要用于顶级窗口),等等.事实上,WPF甚至使事情更具限制性,因为你甚至无法跨线程访问位图等内容.

现在一直是WinRT,一种全新的访问Windows的方式 - 一个新鲜,干净的平板.我们是否仍然坚持使用相同的旧线程限制(具体来说:只能从创建它的线程中操作UI控件),还是让他们打开它?

Jon*_*eet 9

希望它是相同的模型 - 但容易使用,至少从C#和VB,使用新的异步处理,它允许你编写一个同步的方法,只需要等待"等待"在继续之前完成的长期任务.

鉴于强调使异步代码更容易编写,MS会放弃同时要求单线程访问UI的效率,这将是令人惊讶的.

  • @Joe:虽然等待它本身并不需要任何东西(规范只是说明生成的代码会调用什么),但它取决于等待的东西.默认情况下,`Task <T>`将捕获当前上下文并在同一上下文中安排延续 - 因此,如果在UI线程中执行`await`,则继续也将在UI线程上执行.这是async/await的一大卖点 - 你*不需要编写大量代码来进行编组. (2认同)

Han*_*ant 5

线程模型是相同的.仍然存在单线程和多线程公寓(STA/MTA)的概念,必须通过调用RoInitialize来初始化它.其行为与名称,参数和错误返回中的CoInitialize非常相似.用户界面线程是单线程的,在此视频中的36:00确认.